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 ofacme 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.