X (Twitter) Keyword Monitor – Track Mentions, Hashtags
Pricing
from $0.15 / 1,000 results
X (Twitter) Keyword Monitor – Track Mentions, Hashtags
Monitor X (Twitter) for keywords, hashtags, cashtags & @mentions in real time. Scrape the latest matching tweets or run scheduled checks that return only new posts since the last run. Filter by language, likes & retweets, push results to a webhook, and export JSON/CSV/Excel.
Pricing
from $0.15 / 1,000 results
Rating
0.0
(0)
Developer
Chidubem Aneke
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
X (Twitter) Keyword Monitor — Real-Time Alerts for New Tweets
Watch X (Twitter) for the terms that matter. Track keywords, hashtags, cashtags, and @mentions — fetch the latest tweets in one shot, or run on a schedule and get only what's new since the last run.
No X API keys. No developer account. No browser automation to babysit. Pick a run mode, type your terms, and press Start.
⚡ Two run modes — latest snapshot or incremental monitor • 🔔 Optional webhook • 🗓️ Schedule-ready • 🤖 LLM & MCP-ready JSON
Why this Actor
- Two run modes. Latest tweets (default) — grab the N most recent posts for your keyword right now, no saved history. New since last run — for schedules; returns only tweets posted since the previous run, with no duplicates.
- Keywords, hashtags, cashtags, mentions. Watch
product launch,#AI,$TSLA, or@yourbrand— mix and match. Plain terms are auto-combined into efficient OR queries; power users can pass full X search queries with operators. - Instant delivery, safely. Point it at a webhook and new tweets are POSTed to your endpoint as they're found. Every tweet is saved to the dataset first, so a webhook hiccup never loses data.
- Never loses a run to one bad query. A query that errors becomes a tidy
unavailablerow — the rest of your monitor keeps going. - Ultra-light & cheap. Pure HTTP, streams results as they arrive, runs comfortably on 256 MB.
Use cases & outcomes
🔔 Brand & mention monitoring Get alerted the moment someone mentions your brand, product, or executives. Route new tweets straight to Slack, a webhook, a database, or an AI agent.
👂 Social listening Track topics, campaigns, and conversations as they happen. Filter by language and minimum likes to focus on signal, not noise.
🏁 Competitor & campaign tracking Watch competitor names, product hashtags, or event tags and see new activity on every run — build a timeline of what's being said and when.
📈 Cashtag & market chatter
Monitor $TSLA, $BTC, or any cashtag for fresh posts to feed trading signals, dashboards, or research.
🚨 Real-time alerts & incident detection Watch for outage keywords, crisis terms, or security mentions and trigger downstream automations the instant new tweets appear.
🤖 AI agents & RAG pipelines
Feed a continuous stream of clean, flat JSON into an LLM. Stable field names and a query tag on every row mean no brittle parsing.
How it works
Choose a Run mode in the input form:
| Mode | Best for | What it does |
|---|---|---|
| Latest tweets (default) | One-off runs, research, "give me 100 recent posts" | Fetches up to maxNewPerQuery newest tweets per keyword. No saved state — every run is independent. |
| New since last run | Apify Schedules (every 15 min, hourly, …) | Remembers the newest tweet ID per query. Each run returns only tweets newer than that, then updates the watermark. |
Both modes search newest-first. In incremental mode the Actor stops paginating as soon as it hits a tweet from a previous run — so scheduled runs stay fast and cheap.
Incremental first run: no history yet, so it backfills up to
maxNewPerQueryrecent tweets and sets the baseline. From run #2 on, you get only genuinely new posts.
Quick start
- Open the Actor in Apify Console.
- Enter your keywords, hashtags/cashtags, or mentions.
- Leave Run mode on Latest tweets (default) for a one-shot pull, or switch to New since last run before scheduling.
- Press Start.
- Export as JSON / CSV / Excel, pull via the Apify API, or receive them at your webhook.
Try it — latest 100 tweets (default)
{"keywords": ["AI agents", "LLM", "#ai"],"runMode": "latest","maxNewPerQuery": 100}
Scheduled brand monitoring (incremental)
{"keywords": ["Acme Corp", "AcmeCloud"],"mentions": ["acmecorp"],"runMode": "incremental","stateKey": "brand-monitor","webhookUrl": "https://hooks.example.com/x-new-tweets"}
Cashtag stream, high-signal only
{"keywords": ["$TSLA", "$NVDA"],"minLikes": 25,"excludeRetweets": true,"maxItems": 300}
Advanced query (full X operators)
{"queries": ["(outage OR downtime) (\"acme\" OR @acmecorp) -is:retweet lang:en"],"runMode": "latest","maxNewPerQuery": 50}
Schedule this Actor
For ongoing monitoring, set Run mode to New since last run, then create an Apify Schedule:
- Go to Schedules → Create schedule.
- Add this Actor (or a saved Task with your input).
- Set a cron expression — e.g.
*/15 * * * *(every 15 minutes),0 * * * *(hourly). - Save. Each run continues from where the last one left off.
Running several monitors? Give each schedule a different Monitor ID (stateKey in the API), e.g. brand-monitor and competitor-monitor.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
keywords | string[] | [] | Plain terms, auto-combined into OR queries. Terms starting with # become hashtags, $ become cashtags. |
queries | string[] | [] | Full X search query strings, passed through verbatim (supports min_faves:, lang:, -is:retweet, from:, to:, etc.). |
mentions | string[] | [] | Handles to monitor for mentions (with or without @). |
runMode | select | latest | latest = fetch N most recent tweets (one-shot). incremental = only tweets since last run (for schedules). |
stateKey | string | default | Incremental mode only (shown as Monitor ID in Console). Unique name for saved history. Ignored in latest mode. |
language | string | "" | Optional ISO language code filter (e.g. en). |
minLikes | integer | 0 | Keep only tweets with at least this many likes. 0 = off. |
excludeRetweets | boolean | false | Exclude retweets. |
maxNewPerQuery | integer | 100 | Max tweets per query. In latest mode = how many recent posts to fetch. In incremental mode = cap per run (0 = unlimited within maxItems). |
maxItems | integer | 0 | Global ceiling per run across all queries. 0 = unlimited (up to 100,000). Use maxNewPerQuery to cap each keyword. |
webhookUrl | string | "" | Optional http(s) endpoint; tweets POSTed in per-query batches. |
webhookBatchSize | integer | 100 | Max tweets per webhook POST. |
includeRaw | boolean | false | Attach the untouched upstream payload under raw on each record. |
maxRetries | integer | 5 | Retries on rate limits / server errors. |
retryBaseDelayMs | integer | 2000 | Base backoff delay (grows exponentially). |
retryMaxDelayMs | integer | 30000 | Maximum backoff delay. |
You must provide at least one of keywords, queries, or mentions.
Output
Each tweet is a rich JSON object tagged with the query that matched it:
{"featureType": "monitor","query": "(\"AI agents\" OR #ai)","scrapedAt": "2026-07-06T12:15:00.000Z","id": "1900000000000000003","url": "https://x.com/nasa/status/1900000000000000003","text": "Exploring the universe with AI agents…","lang": "en","createdAt": "2026-07-06T12:14:00.000Z","source": "Twitter Web App","type": "tweet","likeCount": 1240,"replyCount": 42,"retweetCount": 320,"quoteCount": 15,"bookmarkCount": 8,"viewCount": 98000,"engagementTotal": 1625,"engagementRate": 0.0166,"hashtags": ["ai"],"symbols": ["TSLA"],"mentions": [{ "username": "openai", "id": "...", "name": "OpenAI" }],"urls": [{ "url": "https://…", "expandedUrl": "https://…", "displayUrl": "…" }],"media": [{ "type": "video", "url": "https://…mp4", "previewUrl": "https://…jpg", "durationMs": 24334, "variants": [{ "bitrate": 2176000, "contentType": "video/mp4", "url": "https://…720x960.mp4" }] }],"poll": null,"card": { "title": "…", "description": "…", "domain": "youtube.com", "imageUrl": "https://…", "appName": "YouTube" },"place": { "name": "Baltimore", "country": "United States", "countryCode": "US" },"community": null,"hasMedia": true, "mediaTypes": ["video"], "hasLinks": true, "hasPoll": false, "hasCard": true,"isReply": false, "isRetweet": false, "isQuote": false, "isEdited": false,"possiblySensitive": false, "isPromoted": false, "isPaidPromotion": false,"hasAIGeneratedMedia": false, "hasBirdwatchNotes": false,"quotedTweet": null,"retweetedTweet": null,"authorUsername": "nasa","author": {"id": "...", "username": "nasa", "displayName": "NASA", "bio": "…","followersCount": 90000000, "followingCount": 200, "tweetCount": 70000,"favoritesCount": 1200, "verified": true, "isBlueVerified": true,"professionalType": "Business", "professionalCategories": ["Science"],"location": "…", "website": "https://nasa.gov", "createdAt": "…", "accountAgeDays": 6200}}
What each tweet captures
| Group | Fields |
|---|---|
| Core | id, url, text, lang, createdAt, source (posting client), type, conversationId |
| Engagement | likeCount, replyCount, retweetCount, quoteCount, bookmarkCount, viewCount, plus derived engagementTotal and engagementRate |
| Entities | hashtags, symbols (cashtags), mentions, urls, and convenience flags hasMedia, mediaTypes, hasLinks, hasPoll, hasCard |
| Media | media[] with photos, GIFs, and playable video renditions (variants[] bitrate/URL), plus durationMs, altText, aspectRatio, sensitiveMedia |
| Rich objects | poll (options + votes), card (link preview: title/description/domain/image/app), place (geo), community |
| Context | replyTo, quotedTweetId/quotedTweet (full embedded tweet), retweetedTweetId/retweetedTweet (full embedded tweet) |
| Signals | isReply, isRetweet, isQuote, isEdited, possiblySensitive, isPromoted, isPaidPromotion, hasAIGeneratedMedia, hasBirdwatchNotes (Community Notes) |
| Author | full profile incl. favoritesCount, professionalType/professionalCategories, verification fields, pinnedTweetIds, and derived accountAgeDays |
A query that can't be fetched produces an explicit marker instead of a silent gap:
{"featureType": "unavailable","inputRef": "(\"AI agents\" OR #ai)","status": "unavailable","reason": "rate_limited","message": "…","scrapedAt": "2026-07-06T12:15:00.000Z"}
Dataset views
The dataset ships with ready-made tabbed views in the Console — sorted newest first:
| View | What it shows |
|---|---|
| Overview | All records: tweets (featureType: monitor) plus any failed queries (unavailable), with engagement totals. |
| New tweets | Engagement columns, language, client, hashtags, cashtags, and media/link flags. |
| Top engagement | Tweets ranked by total engagement and engagement rate. |
| Authors | Flattened author profiles (followers, verification, professional type, account age, bio). |
| Verified & pro authors | Author details focused on verification and business/creator accounts — for lead-gen and credibility filtering. |
| Media | Media-bearing tweets with type breakdown and the full media array (incl. video renditions). |
| Links & cards | Tweets with outbound links or link-preview cards (title/description/domain) — brand/PR monitoring. |
| Polls | Tweets with polls, options, and vote tallies. |
| Geo | Tweets with an attached place (city/country) for location trends. |
| Community Notes | Tweets flagged with a Community Note — misinformation tracking. |
| Promoted | Promoted / paid-promotion tweets — ad intelligence. |
| Unavailable | Queries that errored this run (the monitor keeps going). |
Every field is also documented in the dataset schema for Apify MCP and agent tooling.
Run summary (OUTPUT)
After every run, the OUTPUT tab shows a summary:
{"runMode": "incremental","stateKey": "brand-monitor","totalNew": 12,"queryResults": [{"query": "(\"AI agents\" OR #ai)","firstRun": false,"newCount": 12,"previousMaxId": "1899999999999999990","newMaxId": "1900000000000000003","newestCreatedAt": "2026-07-06T12:14:00.000Z","webhookDelivered": 12,"webhookFailed": 0}],"upstreamRequestCount": 3,"webhookConfigured": true,"errors": []}
Webhook payload
When webhookUrl is set, the monitor POSTs new tweets in per-query batches (chunked by webhookBatchSize):
{"type": "x_keyword_monitor.new_tweets","query": "(\"AI agents\" OR #ai)","count": 12,"chunkIndex": 0,"deliveredAt": "2026-07-06T12:15:00.000Z","runId": "…","actorRunUrl": "https://console.apify.com/view/runs/…","tweets": [ { "...": "canonical tweet object" } ]}
Delivery is best-effort with automatic retry/backoff. Tweets are always written to the dataset before any webhook attempt, so a failed webhook never loses data — failures are counted in the run summary.
Built for LLMs, agents & MCP
- Flat, predictable records —
camelCasekeys,nullfor missing values, no deep nesting. - A
querytag on every row — agents know exactly which watch term produced each tweet. - Canonical URLs & ISO timestamps — every tweet has a full
https://x.com/...link and UTC dates.
Use it through Apify MCP or export JSON/CSV from the dataset API and pipe into your pipeline.
FAQ
Do I need an X/Twitter API key? No. It works out of the box.
What's the difference between the two run modes? Latest tweets (default) fetches the N most recent posts and ignores any saved history — use it when you just want "give me 100 tweets for this keyword." New since last run is for schedules: each run returns only tweets posted since the previous run.
Will I get duplicate tweets across runs? In incremental mode, no — the Actor tracks the newest tweet ID per query. In latest mode, each run is independent (you may see the same tweets if you run again without changing inputs).
What happens on the first incremental run? No history yet, so it backfills up to maxNewPerQuery recent tweets and sets the baseline. From run #2 on, you get only new tweets.
Why did I get zero tweets? In incremental mode, that usually means nothing new was posted since the last run. In latest mode, check your keywords/filters — the query may genuinely have no matches.
How do I run multiple scheduled monitors? Use incremental mode and give each schedule a different Monitor ID (stateKey).
What formats can I export? JSON, CSV, Excel, HTML, or RSS — plus the Apify API, webhooks, and integrations.
Support
Open an issue on the Actor page or contact the publisher with your run ID and your (redacted) input JSON.
Contact me
Need something built beyond this Actor? I take on custom projects of all sizes — from one-off scrapers to full products.
| dubem115@gmail.com | |
| GitHub | github.com/DrunkCodes |
What I can help with:
- Scraping & data extraction — Apify Actors and scrapers for X, Amazon, LinkedIn, e-commerce, lead gen, and any site or API you need
- Automation & pipelines — scheduled monitors, webhooks, enrichment, and export to Sheets, databases, or your stack
- Web apps — dashboards, SaaS tools, internal tools, APIs, and full-stack applications of any kind
Send a short description of what you want built and your timeline — happy to discuss scope and pricing.