X (Twitter) Keyword Monitor – Track Mentions, Hashtags avatar

X (Twitter) Keyword Monitor – Track Mentions, Hashtags

Pricing

from $0.15 / 1,000 results

Go to Apify Store
X (Twitter) Keyword Monitor – Track Mentions, Hashtags

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

Chidubem Aneke

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

8 days ago

Last modified

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 unavailable row — 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:

ModeBest forWhat 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 runApify 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 maxNewPerQuery recent tweets and sets the baseline. From run #2 on, you get only genuinely new posts.


Quick start

  1. Open the Actor in Apify Console.
  2. Enter your keywords, hashtags/cashtags, or mentions.
  3. Leave Run mode on Latest tweets (default) for a one-shot pull, or switch to New since last run before scheduling.
  4. Press Start.
  5. 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:

  1. Go to Schedules → Create schedule.
  2. Add this Actor (or a saved Task with your input).
  3. Set a cron expression — e.g. */15 * * * * (every 15 minutes), 0 * * * * (hourly).
  4. 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

FieldTypeDefaultDescription
keywordsstring[][]Plain terms, auto-combined into OR queries. Terms starting with # become hashtags, $ become cashtags.
queriesstring[][]Full X search query strings, passed through verbatim (supports min_faves:, lang:, -is:retweet, from:, to:, etc.).
mentionsstring[][]Handles to monitor for mentions (with or without @).
runModeselectlatestlatest = fetch N most recent tweets (one-shot). incremental = only tweets since last run (for schedules).
stateKeystringdefaultIncremental mode only (shown as Monitor ID in Console). Unique name for saved history. Ignored in latest mode.
languagestring""Optional ISO language code filter (e.g. en).
minLikesinteger0Keep only tweets with at least this many likes. 0 = off.
excludeRetweetsbooleanfalseExclude retweets.
maxNewPerQueryinteger100Max tweets per query. In latest mode = how many recent posts to fetch. In incremental mode = cap per run (0 = unlimited within maxItems).
maxItemsinteger0Global ceiling per run across all queries. 0 = unlimited (up to 100,000). Use maxNewPerQuery to cap each keyword.
webhookUrlstring""Optional http(s) endpoint; tweets POSTed in per-query batches.
webhookBatchSizeinteger100Max tweets per webhook POST.
includeRawbooleanfalseAttach the untouched upstream payload under raw on each record.
maxRetriesinteger5Retries on rate limits / server errors.
retryBaseDelayMsinteger2000Base backoff delay (grows exponentially).
retryMaxDelayMsinteger30000Maximum 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

GroupFields
Coreid, url, text, lang, createdAt, source (posting client), type, conversationId
EngagementlikeCount, replyCount, retweetCount, quoteCount, bookmarkCount, viewCount, plus derived engagementTotal and engagementRate
Entitieshashtags, symbols (cashtags), mentions, urls, and convenience flags hasMedia, mediaTypes, hasLinks, hasPoll, hasCard
Mediamedia[] with photos, GIFs, and playable video renditions (variants[] bitrate/URL), plus durationMs, altText, aspectRatio, sensitiveMedia
Rich objectspoll (options + votes), card (link preview: title/description/domain/image/app), place (geo), community
ContextreplyTo, quotedTweetId/quotedTweet (full embedded tweet), retweetedTweetId/retweetedTweet (full embedded tweet)
SignalsisReply, isRetweet, isQuote, isEdited, possiblySensitive, isPromoted, isPaidPromotion, hasAIGeneratedMedia, hasBirdwatchNotes (Community Notes)
Authorfull 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:

ViewWhat it shows
OverviewAll records: tweets (featureType: monitor) plus any failed queries (unavailable), with engagement totals.
New tweetsEngagement columns, language, client, hashtags, cashtags, and media/link flags.
Top engagementTweets ranked by total engagement and engagement rate.
AuthorsFlattened author profiles (followers, verification, professional type, account age, bio).
Verified & pro authorsAuthor details focused on verification and business/creator accounts — for lead-gen and credibility filtering.
MediaMedia-bearing tweets with type breakdown and the full media array (incl. video renditions).
Links & cardsTweets with outbound links or link-preview cards (title/description/domain) — brand/PR monitoring.
PollsTweets with polls, options, and vote tallies.
GeoTweets with an attached place (city/country) for location trends.
Community NotesTweets flagged with a Community Note — misinformation tracking.
PromotedPromoted / paid-promotion tweets — ad intelligence.
UnavailableQueries 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 recordscamelCase keys, null for missing values, no deep nesting.
  • A query tag 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.

Emaildubem115@gmail.com
GitHubgithub.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.