Skip to content

How to set up Twitter keyword alerts in 2026

Set up Twitter keyword alerts: what X gives you free, X Pro and Syften, and a short script that polls X search and sends new tweets to Slack or email.

Piyushh · October 14, 2026 · 6 min read

X has no built-in Twitter keyword alerts. What it gives you for free is saved searches, which you have to reopen yourself, and post notifications for specific accounts. To get pinged when a word or phrase is tweeted, you can pay for a hosted alert tool that covers X, such as Syften, KWatch.io or Octolens. The other route is a small script that polls X search every 15 to 30 minutes and sends new tweets to Slack or email.

The free options come first in this guide, then the hosted tools, then the script. The focus is keywords. If you want to watch what people say to a handle, our Twitter monitoring tools comparison also covers mention tracking. Everything about X's own features was checked in X's help center on Oct 14, 2026.

Free Twitter keyword alerts with X itself

Saved searches

X's advanced search filters by all words, exact phrases, any of several words, excluded words, hashtags, language, accounts, replies, mentions, place and date. When a search returns what you want, save it and it appears in a "Saved searches" list the next time you tap the search box. That is the whole feature. Nothing notifies you when new results appear, so it only works if you already check X every day. A social media manager in r/socialmedia described native search plus saved searches this way: "Works, but you babysit it and there's no alerting."

Account notifications

X's only real push alert is per account. In the mobile app, open a profile, tap the notification icon and choose all posts or only live video (X help center). You'll hear when a competitor or a journalist posts, but not when anyone mentions your keyword.

X Pro columns

For years, TweetDeck's live search columns were the closest thing to free keyword alerts. TweetDeck is now X Pro, and X's Premium page lists "Access to X Pro" under "Only for Premium+ Tier". On Oct 14, 2026, Premium+ was listed at $40 a month on the web in the US. X says X Pro columns "refresh in realtime", but you still have to be looking at the screen.

Hosted tools that send Twitter alerts for keywords

If you'd rather not run code, these tools take your keywords and push matches to you. Prices are as listed on Oct 14, 2026.

Syften is a keyword alert service that started with communities like Reddit and Hacker News. X costs an extra $40 a month on its Standard ($49.95) and PRO ($119.95) plans, and Syften lists a target delay of up to 15 minutes for X. Every plan sends alerts to email, RSS and its API. Standard adds Slack, and PRO adds webhooks and MCP. You can trial PRO for 14 days without a card. It suits a team that wants X and Reddit in one alert stream with filters it can tune. A user in r/sideprojects who set it up for Reddit described the result as "pretty hands off once set up."

KWatch.io includes X from its $19 Essential plan, with Slack and webhooks from the $79 Business plan. Octolens covers X with webhooks and an API on every plan, from $159 a month billed annually. Suites like Brand24 and Mention also alert on X keywords and cost more. Our Twitter monitoring tools comparison has the full table.

Build your own Twitter keyword alerts

A script can do the same job as the hosted tools: search for your terms, keep only tweets newer than the last one it saw, and send them on. It runs to about 60 lines.

Write a query that cuts noise

Most of the work is in the query, not the code. ChatterAPI's tweet search accepts X's search operators inside q: "exact phrase", OR, -word, from:, to:, min_faves: and filter:links. Some patterns that help:

  • Quote multi-word names: "acme analytics" instead of acme analytics.
  • Exclude the obvious noise: "acme" -hiring -giveaway.
  • Skip your own account: "acme" -from:acmehq.
  • Search for intent as well as the name: "alternative to acme" OR "acme vs".

A founder building a lead tool on X described the problem in this tweet, which also shows up in our sample below: "'Someone discussing CRMs' and 'someone asking for a CRM recommendation' look similar but are completely different" (@mohitbajoriaa).

The request

curl -s "https://api.chatterapi.com/v1/x/tweets/search?q=%22crm+recommendation%22&sort=latest" \
  -H "Authorization: Bearer $CHATTERAPI_KEY"

sort=latest returns the newest tweets first, which is what monitoring needs (top returns the most engaged). Each page holds about 20 tweets and costs 3 credits. Below is a real response, trimmed to two tweets. It's a sample. We ran it with a test key, which returns one recorded real response per endpoint at no charge, so charged is 0. A live key charges 3 credits.

{
  "data": [
    {
      "id": "2099495333231288346",
      "text": "meta ads: how important is the “connect to your crm” recommendation?…",
      "url": "https://x.com/HesomParhizkar/status/2099495333231288346",
      "createdAt": "2026-09-14T13:47:48.000Z",
      "likes": 2,
      "replies": 2,
      "isRetweet": false,
      "author": { "handle": "HesomParhizkar" }
    },
    {
      "id": "2030294157340860574",
      "text": "Biggest thing I learned building LeadSignal:\n\n\"Someone discussing CRMs\" and \"someone asking for a CRM recommendation\" look similar but are completely different.…",
      "url": "https://x.com/mohitbajoriaa/status/2030294157340860574",
      "createdAt": "2026-03-07T14:47:02.000Z",
      "likes": 3,
      "replies": 0,
      "isRetweet": false,
      "author": { "handle": "mohitbajoriaa", "followers": 531 }
    }
  ],
  "page": { "nextCursor": "AcWNIo1WFWYR…", "hasMore": true },
  "credits": { "charged": 0, "remaining": 719 },
  "requestId": "req_01M4X1HC8P4MQT13QJ4Y",
  "cached": true
}

If you want to test a query before writing code, the free tweet search tool runs the same endpoint in the browser.

The script

The search endpoint has no since_id parameter, so the script tracks its own. Tweet ids on X increase over time, so storing the newest id per query and keeping only larger ids works as a dedupe. The script pages forward until it reaches a tweet it has already seen (capped at three pages). Then it posts the new ones to a Slack incoming webhook, or emails them if you set SMTP variables instead.

import json, os, pathlib, smtplib, requests
from email.message import EmailMessage

API = "https://api.chatterapi.com/v1/x/tweets/search"
HEADERS = {"Authorization": f"Bearer {os.environ['CHATTERAPI_KEY']}"}
QUERIES = ['"yourbrand"', '"alternative to competitor" -hiring', '"recommend a crm" min_faves:1']
STATE = pathlib.Path("x_alerts_state.json")  # newest tweet id seen, per query
MAX_PAGES = 3                                 # 3 credits per page

state = json.loads(STATE.read_text()) if STATE.exists() else {}

def new_tweets(q, since_id):
    """Pages through newest-first results until it reaches a tweet it has seen."""
    found, cursor = [], None
    for _ in range(MAX_PAGES):
        params = {"q": q, "sort": "latest", "includeRetweets": "false"}
        if cursor:
            params["cursor"] = cursor
        r = requests.get(API, params=params, headers=HEADERS, timeout=30)
        if r.status_code != 200:
            print(f"{q}: HTTP {r.status_code} {r.text[:200]}")  # failed calls cost 0 credits
            break
        body = r.json()
        fresh = [t for t in body["data"] if int(t["id"]) > since_id]
        found += fresh
        if len(fresh) < len(body["data"]) or not body["page"]["hasMore"]:
            break  # reached tweets we have already seen
        cursor = body["page"]["nextCursor"]
    return found

def notify(lines):
    text = "\n\n".join(lines)
    if os.environ.get("SLACK_WEBHOOK_URL"):
        requests.post(os.environ["SLACK_WEBHOOK_URL"], json={"text": text}, timeout=10)
    elif os.environ.get("SMTP_HOST"):
        msg = EmailMessage()
        msg["Subject"], msg["From"], msg["To"] = f"{len(lines)} new tweets", os.environ["ALERT_FROM"], os.environ["ALERT_TO"]
        msg.set_content(text)
        with smtplib.SMTP(os.environ["SMTP_HOST"], 587) as s:
            s.starttls()
            s.login(os.environ["SMTP_USER"], os.environ["SMTP_PASS"])
            s.send_message(msg)
    else:
        print(text)

for q in QUERIES:
    since_id = state.get(q, 0)
    tweets = new_tweets(q, since_id)
    if tweets:
        state[q] = max(int(t["id"]) for t in tweets)
    if since_id and tweets:  # the first run only records the newest id
        notify([f"{q}\n@{t['author']['handle']}: {t['text'][:240]}\n{t['url']}"
                for t in sorted(tweets, key=lambda t: int(t["id"]))])

STATE.write_text(json.dumps(state))

We ran this against the API before publishing. On the first run it records the newest id for each query and sends nothing, so your channel doesn't fill up with old tweets. Every run after that sends only tweets newer than that id, oldest first.

Schedule and cost

Run it from cron:

*/20 * * * * cd /opt/x-alerts && CHATTERAPI_KEY=... SLACK_WEBHOOK_URL=... python3 x_alerts.py >> x_alerts.log 2>&1

Each run costs one search page (3 credits) per query, plus extra pages only when a lot gets tweeted between runs:

  • Every 20 minutes is 72 runs a day, or 2,160 a month.
  • Three queries: 2,160 × 3 × 3 credits = 19,440 credits a month.

That fits the Starter plan ($19/month for 25,000 credits). The same three queries every 15 minutes come to 25,920, just over Starter, so either drop a query or move to Growth ($49/month for 70,000). Don't schedule it more often than every 10 minutes. Repeat calls with the same input within 10 minutes are served from cache but cost the same as fresh ones, so you'd pay for results you already have. Failed calls cost 0 credits.

The same pattern works on Reddit search if you want Reddit in the same alerts, and our guide to monitoring Reddit for keywords has that version. To catch a brand name everywhere in one call, use the cross-platform mentions endpoint from our brand mention monitor guide.

Alert on keywords, never auto-reply

It's tempting to have the script reply for you next. Don't. X's automation rules state that "sending automated replies to posts based on keyword searches alone is not permitted." An r/n8n post that built that kind of reply bot drew a comment from a beginner whose accounts kept getting banned: "my accounts get banned very quickly" (comment). Let the alerts find the tweet, and let a person decide whether a reply would help.

The other way this goes wrong is alerting on too much. In the r/socialmedia thread above, one manager said "if you alert on everything you start ignoring the channel inside a week." Another kept "alerts only for high-intent terms like brand name, founder name, product name, competitor launches, angry keywords" and moved everything else to a weekly review. The script handles that split if you run the urgent queries every 20 minutes and the broad ones once a day.

Start your Twitter alerts

ChatterAPI gives your code and your agents Reddit and X data through one key, over REST or MCP. You don't need to apply for a developer account. Sign up with Google and you get 100 free credits without a card. That covers 33 search calls, enough to tune your queries before you schedule anything. Plans start at $19/month for 25,000 credits. ChatterAPI is independent of X.

FAQ

Does X have keyword alerts?
Not as push notifications. X's help center documents saved searches, which you reopen by hand, and post notifications for specific accounts. For an alert when a keyword is tweeted, use a hosted tool that covers X or a script that polls X search.
Is TweetDeck still available for keyword alerts?
TweetDeck is now X Pro, and X's help center lists X Pro access under Premium+ only, listed at $40 a month on the web in the US on Oct 14, 2026. X Pro shows search columns that refresh in real time, but you have to be looking at them.
How often should a Twitter alert script check?
Every 15 to 30 minutes is plenty for most brands. With ChatterAPI, repeat calls with the same input within 10 minutes come from cache and cost the same, so checking more often than every 10 minutes buys nothing. Each search page costs 3 credits.
Can I auto-reply to tweets that match my keywords?
No. X's automation rules say that sending automated replies to posts based on keyword searches alone is not permitted. Use alerts to find tweets, then reply by hand when you have something useful to say.

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.