Twitter APIX APIMonitoringSocial ListeningDeveloper Tools

How to Monitor Twitter (X) Accounts with an API (2026 Guide)

Monitor X accounts for new tweets, mentions, and profile changes with a pay-per-call API. Polling patterns, code, alert wiring, scale math, and what it costs in 2026.

GetXAPI·
Guide to monitoring Twitter/X accounts with an API in 2026, covering new tweets, mentions, profile changes, alerts, and cost

Monitoring a Twitter (X) account with an API means polling for three signals and acting on the changes: new tweets from the account, new mentions of the account, and edits to the account's profile. In 2026 the official X API makes that harder than it should be, real-time streaming is gated to legacy and Enterprise tiers, and reads are billed per request at about $0.005 each, so most monitoring is built on a polling loop against a read API. This guide shows the exact polling patterns, working code against a pay-per-call endpoint, how to wire alerts, how to batch many accounts without the bill exploding, and what it all costs.

TL;DR: To monitor an X account, poll a read API on an interval and diff against the last state you saw. For new tweets, pull the account's recent tweets and track the newest tweet ID. For mentions, run an advanced search for the handle. For profile changes, re-read the user object and compare fields. Streaming is lower latency but the official X API gates it behind a legacy or Enterprise tier that is closed to most new developers, so polling is the default. With GetXAPI you poll the same public fields with a single bearer token at $0.001 per call and no monthly minimum, then push changes to Slack or a webhook. This post covers the three monitoring signals, working code, alert wiring, scale and cost math, and production hardening.

The three signals that make up Twitter account monitoring: new tweets from the account, new mentions of the account, and profile field changes

What "monitoring a Twitter account" actually means

Account monitoring is not one task, it is three, and most tools quietly do only the first. The first signal is new tweets: the account posts something and you want to know within seconds. The second is mentions: someone else posts about the account, tags the handle, or replies, and you want that in your inbox even though it never touches the account's own timeline. The third is profile changes: the bio, display name, follower count, profile picture, or pinned tweet changes, which matters for brand-impersonation alerts, competitive intelligence, and tracking when a watched account pivots.

Each signal maps to a different read call and a different diffing strategy, but they share one engine: poll on an interval, compare against the last state you stored, and act only on what is new. Get that loop right once and you can monitor one account or a thousand with the same code. The rest of this guide builds that loop for each signal, then makes it cheap and production-safe.

It helps to know which signal your use case actually needs, because most people over-build. Brand monitoring is mostly the mentions signal: you care what other people say about a handle or a product name, not what the brand posts. Competitive intelligence is mostly the new-tweets and profile signals: you watch what a rival ships and when they change positioning. Lead generation is the mentions signal with a keyword query: you watch for posts that express intent ("looking for an X tool", "anyone recommend") rather than a specific handle. Alerting and compliance are usually new tweets from a small, fixed list of accounts where latency matters most. Map your job to one or two signals before you write a line of code, and you avoid paying to poll data you will never read.

The reason this matters financially is that each signal has a different natural polling cadence. New tweets from a breaking-news account might justify a 10-second loop; a competitor's bio changes maybe once a quarter and can be checked hourly. Tuning the interval per signal is the single biggest lever on what a monitor costs, and it is a lever the all-in-one SaaS tools never expose because they bill a flat subscription regardless.

Where account monitoring actually pays off

Before the code, it is worth grounding the why, because the architecture you build should follow the outcome you need. Four use cases drive almost all serious account monitoring, and each leans on a different mix of the three signals.

Brand and reputation monitoring is the mentions signal at its core. You watch for posts that name a company, product, or executive, route the angry ones to support and the positive ones to marketing, and catch a brewing issue while it is still ten posts instead of ten thousand. The value is response time, and response time is exactly what a tight poll loop buys you.

Competitive intelligence leans on new tweets plus profile changes. You watch a rival's account for launches, pricing posts, and positioning shifts, and you watch the profile for the quieter signals: a new bio, a changed pinned tweet, a sudden follower spike that hints at a campaign. None of that shows up in a dashboard you do not build, and all of it is a poll-and-diff away.

Lead generation is the mentions signal pointed at intent rather than a handle. Instead of a brand name you query for buying signals, phrases like "looking for", "anyone recommend", or "alternative to", scoped to your category, and you get a feed of people raising their hand in public. The query is the product here, and the advanced search endpoint is what makes it programmable.

Alerting and compliance is new tweets from a small, fixed, high-stakes list where latency and reliability matter more than scale. A regulator account, a status account, a key executive: you want the alert in seconds and you want to know the moment the monitor itself goes dark. This is where the production-hardening section later in this guide earns its place.

Why monitoring is hard on the official X API in 2026

The honest reason most developers reach for a third-party read API is that the official X API has priced monitoring out of reach for anyone who is not an enterprise. Real-time filtered streaming, the feature you would naturally use to monitor accounts, lives behind the legacy Pro tier (now closed to new signups) or Enterprise, which starts in the tens of thousands (docs.x.com filtered stream). Pay-per-use reads, introduced as the default in February 2026, bill third-party post reads at about $0.005 each (postproxy.dev X API pricing 2026).

That pricing is not a rumor, it is the daily complaint of people who build on the platform. The sentiment is consistent across the developer crowd: the API is too expensive to build anything real on, and the cost pushes people toward workarounds.

The rate limits compound the cost problem. The user-timeline endpoint allows 10,000 app-level requests per 15 minutes, recent search allows 450, and the filtered stream allows a single concurrent connection on pay-per-use (docs.x.com rate limits). Those are workable numbers for polling, but only if you are not also paying $0.005 per read on top. The practical result is that monitoring at any real volume on the official API runs into either a closed streaming tier or a per-read bill that grows with every account you add.

The history is worth knowing because it explains why so many monitoring tools simply vanished. The free tier that powered a generation of Twitter monitors was gutted in February 2023, paid tiers launched at $100 and $5,000 per month that April, the Basic tier doubled to $200 in October 2024 (TechCrunch), and in February 2026 X moved to a pay-per-use model as the default (Gigazine). Each step retired another batch of independent tools whose economics no longer worked. Some developers describe the experience of trying to scale up as adversarial rather than commercial.

The recurring theme in these threads is not that developers refuse to pay, it is that the pricing is structured so that the only options are "too limited to use" or "too expensive to justify", with nothing in between for a normal monitoring workload. That gap is the entire reason per-call read APIs exist.

Official X API cost and access for monitoring in 2026: filtered stream gated to the legacy Pro tier (closed to new signups), pay-per-use reads at about $0.005 each

Polling vs streaming: pick polling for almost all monitoring

The instinct is to want streaming because it sounds real time, but for monitoring it is usually the wrong default. Streaming wins only when you need millisecond-level alerts across a large keyword space and you have the engineering capacity to handle reconnects, gap recovery, and rule management. For brand listening, news monitoring, lead generation, compliance alerts, and content moderation, polling is simpler, cheaper, and good enough.

The tradeoff is latency for simplicity. A poll loop running every 10 to 30 seconds detects a new tweet within that window plus the API response time, which for monitoring is almost always acceptable. Streaming shaves that to a second or two, but on the official X API that capability is gated to legacy or Enterprise access and forces a held-open connection your code has to babysit. A poll loop is a cron job and a stored ID. When you can hit a read endpoint cheaply, polling is not the compromise, it is the right architecture.

The request-volume math makes the interval decision concrete. Polling a single query once per second is about 2,592,000 requests a month; every 5 seconds is 518,400; every 10 seconds is 259,200; every 30 seconds is 86,400. Those numbers are per query, not per account, which is the key insight for scaling: if one query can match many accounts, the cost stays flat as the watchlist grows. Pick the slowest interval your use case tolerates, because halving the frequency halves the bill with no code change. Most monitoring jobs are perfectly served at 30 seconds, and many profile-change jobs at an hour.

Streaming only earns its complexity above a clear threshold: when you need sub-two-second alerts on a firehose of keywords, and you have the engineering time to handle reconnects and gap recovery. Below that, the held-open connection is a liability, not a feature, because every restart, deploy, or network blip risks a silent gap in coverage that a stateless poll loop simply does not have. The official streaming API has its own quirks too, it delivers over HTTP chunked transfer with a keep-alive every 20 seconds rather than WebSockets, and P99 delivery latency runs around 6 to 7 seconds (data365 streaming overview).

Polling versus streaming for Twitter monitoring: latency, cost, complexity, and which one fits each monitoring job

Start building with GetXAPI

$0.05 per 1,000 tweets. $0.10 free credits. No credit card required.

Signal 1: monitor an account for new tweets

The core pattern is the last-seen-ID loop. Pull the account's recent tweets, find the newest tweet ID, store it, and on every subsequent poll treat any tweet with a larger ID as new. IDs are monotonic on X, so comparing IDs is more reliable than comparing timestamps, which can collide or arrive out of order.

With GetXAPI this is a single authenticated GET. The base URL is https://api.getxapi.com, you authenticate with a bearer token, and reading the user timeline costs $0.001 per call.

import requests

API = "https://api.getxapi.com"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

def fetch_recent_tweets(username):
    r = requests.get(
        f"{API}/twitter/user/tweets",
        headers=HEADERS,
        params={"userName": username},
        timeout=20,
    )
    r.raise_for_status()
    return r.json().get("tweets", [])

def check_for_new_tweets(username, last_seen_id):
    tweets = fetch_recent_tweets(username)
    fresh = [t for t in tweets if int(t["id"]) > int(last_seen_id or 0)]
    if fresh:
        new_last = max(int(t["id"]) for t in fresh)
        return fresh, str(new_last)
    return [], last_seen_id

You run check_for_new_tweets on an interval, persist the returned ID, and hand the fresh list to whatever does the alerting. On the first run, store the newest ID without alerting so you do not fire on the backlog. After that, every new post for the account flows through fresh exactly once.

A few edge cases decide whether this loop is trustworthy. Retweets and replies come back in the timeline too, so decide early whether a retweet by the account counts as a monitored event; for most brand and competitor monitors you keep original posts and replies but drop pure retweets, which you can filter on a flag in each tweet object. Pinned tweets can resurface at the top of a timeline without being new, which is exactly why you compare IDs rather than position. And a burst of posts between two polls is handled for free by the loop, because you select every tweet with an ID above your stored value, not just the single newest one.

Each tweet object you get back carries the fields a monitor needs without extra calls: the tweet ID and text, the author handle and display name, the created-at timestamp, and the public engagement counts (likes, retweets, replies, views). That means your alert can include not just "they posted" but "they posted, and it is already at 2,000 likes", which is often the more useful signal. Because the payload is the same public shape the platform exposes, you can store exactly the fields you need and nothing you do not, which keeps both your storage and your privacy footprint small.

The last-seen-ID polling loop for new tweets: fetch recent tweets, compare IDs against the stored value, act on what is new, then update the stored ID

The community has converged on exactly this no-credentials, poll-a-read-API approach. A widely shared workflow walked through monitoring X without OAuth by pointing at a server-side read API instead of wiring up a developer account.

Built a Twitter/X monitoring workflow, no OAuth, no developer account from r/n8n

Signal 2: monitor mentions of an account

Mentions never appear on the account's own timeline, so you cannot catch them by polling user tweets. You catch them with search. Query the advanced search endpoint for posts that tag the handle, sort by latest, and track the newest processed ID the same way you did for tweets.

def fetch_mentions(handle):
    r = requests.get(
        f"{API}/twitter/tweet/advanced_search",
        headers=HEADERS,
        params={"q": f"@{handle} OR to:{handle}", "product": "Latest"},
        timeout=20,
    )
    r.raise_for_status()
    return r.json().get("tweets", [])

def check_for_new_mentions(handle, last_seen_id):
    mentions = fetch_mentions(handle)
    fresh = [m for m in mentions if int(m["id"]) > int(last_seen_id or 0)]
    new_id = max([int(m["id"]) for m in fresh], default=int(last_seen_id or 0))
    return fresh, str(new_id)

The q parameter takes standard X search operators, so you are not limited to mentions. Swap in a brand keyword, a cashtag, a competitor handle, or a phrase and the same loop becomes brand monitoring or competitive intelligence. The product value of Latest keeps results in reverse-chronological order, which is what you want for an alerting pipeline.

Two refinements make the mention loop production-grade. First, deduplicate across overlapping queries: if you monitor both @handle and a brand keyword, the same post can match both, so key your "already alerted" set on the tweet ID rather than on the query that found it. Second, scope the query to cut noise before it reaches you. Operators like -filter:retweets to drop retweets, lang:en to limit language, or -from:handle to exclude the account's own replies to itself keep the fresh list focused on genuine outside mentions. The cleaner the query, the fewer false alerts your team learns to ignore, and an alert stream people ignore is the same as no monitor at all.

Monitoring mentions with advanced search: query the handle with search operators, sort by latest, track the newest processed ID, alert on fresh mentions

Signal 3: detect profile changes

Profile monitoring is a re-read and a diff. Pull the user object on an interval, compare the fields you care about against the last snapshot you stored, and emit an event for anything that changed. This is the signal behind impersonation alerts, "a watched account changed its bio" notifications, and tracking when a competitor swaps its pinned tweet.

def fetch_profile(username):
    r = requests.get(
        f"{API}/twitter/user/info",
        headers=HEADERS,
        params={"userName": username},
        timeout=20,
    )
    r.raise_for_status()
    return r.json().get("user", {})

WATCH_FIELDS = ["name", "description", "profile_image_url", "followers_count", "pinned_tweet_id"]

def diff_profile(username, previous):
    current = fetch_profile(username)
    changes = {f: (previous.get(f), current.get(f))
               for f in WATCH_FIELDS
               if previous.get(f) != current.get(f)}
    return changes, current

Store the returned current snapshot after each poll so the next run has a baseline. Because profile fields change far less often than tweets, you can poll this signal on a slower interval (every few minutes or hourly) to keep the call volume and the cost low.

Each field you watch carries a different meaning, which is why a raw diff is more useful than it looks. A display-name or username change on a watched account is an impersonation and brand-safety signal, the kind you want to catch within the hour. A bio change on a competitor often precedes a launch or a pivot, since teams update positioning copy before they announce. A pinned-tweet change is the cheapest possible read on "what does this account most want you to see right now". And a sharp move in follower count flags either a viral moment or a bought-follower campaign worth a closer look. Tag each change event with which field moved so downstream consumers can route an impersonation alert differently from a routine bio tweak.

One caution on the follower-count field specifically: it drifts constantly by small amounts, so alerting on every change is noise. Apply a threshold, a percentage move or an absolute delta, so you only surface meaningful jumps and not the normal churn of a single follow and unfollow between polls.

Profile-change detection: re-read the user object, diff the watched fields against the stored snapshot, emit a change event, then save the new snapshot

Monitor many accounts without the bill exploding

Polling each account individually is fine for a handful of handles and ruinous for a hundred. Watching 50 accounts every 10 seconds is 50 times your single-account call volume, which is millions of calls a month. The fix is to stop polling per account and start matching many accounts in one call.

The advanced search endpoint accepts boolean operators, so a single query like from:alice OR from:bob OR from:carol returns new tweets from several accounts at once, and one call covers the whole group instead of one call per handle. You still run the last-seen-ID loop, you just run it over a batched query. For very large lists you split accounts into a few search queries sized to the result window and poll those. The cost then scales with the number of queries and your interval, not with the raw account count.

The savings are not marginal, they are an order of magnitude. Polling 50 accounts individually every 10 seconds is 50 separate calls per cycle, roughly 432,000 calls a day. Folding those same 50 handles into a handful of batched from: queries collapses that to a few thousand calls a day for the same coverage. At $0.001 per call the individual approach is around $430 a day and the batched approach is single-digit dollars, for identical results. The only reason to ever poll per account is when you need each account on a different cadence; otherwise, batch.

There is a ceiling to how many from: clauses one query handles cleanly before the result window truncates, so the real pattern for large watchlists is to shard: group accounts into queries of a sane size, stagger their poll offsets so you are not firing them all in the same second, and run each shard through the same last-seen-ID loop with its own stored cursor. That keeps any single query inside the result window while the whole system still covers hundreds or thousands of handles.

def build_batched_queries(handles, per_query=10):
    # group handles into OR queries so one call covers many accounts
    for i in range(0, len(handles), per_query):
        chunk = handles[i:i + per_query]
        yield " OR ".join(f"from:{h}" for h in chunk)

def poll_batch(query, last_seen_id):
    r = requests.get(
        f"{API}/twitter/tweet/advanced_search",
        headers=HEADERS,
        params={"q": query, "product": "Latest"},
        timeout=20,
    )
    r.raise_for_status()
    tweets = r.json().get("tweets", [])
    fresh = [t for t in tweets if int(t["id"]) > int(last_seen_id or 0)]
    new_id = max([int(t["id"]) for t in fresh], default=int(last_seen_id or 0))
    return fresh, str(new_id)

This is corroborated by practitioners who have done the migration off official-API streaming to a polled, batched read at a fraction of the cost (Sorsa real-time monitoring guide).

Batching the monitoring of many accounts: one search query matches several handles per call, so cost scales with queries and interval, not with account count

This batching difference is exactly why developers building real monitoring products move off per-account official-API reads. The cost of doing it the naive way on the official tiers is what pushes teams to a per-call alternative in the first place.

A Twitter API that watches a user's posts from r/learnprogramming

Wire the alerts: Slack, Discord, or any webhook

A monitor is only useful if it tells someone. Once the loop produces a fresh list, push each item to wherever your team lives. A Slack or Discord incoming webhook is a single POST, and any custom endpoint works the same way.

def alert(webhook_url, tweet, handle):
    text = f"New from @{handle}: {tweet['text']}\nhttps://x.com/{handle}/status/{tweet['id']}"
    requests.post(webhook_url, json={"text": text}, timeout=10)

def run_once(handle, state, webhook_url):
    fresh, state["last_id"] = check_for_new_tweets(handle, state.get("last_id"))
    for t in fresh:
        alert(webhook_url, t, handle)
    return state

Keep the alerting decoupled from the polling. If you alert inline and the webhook is slow or down, your poll loop stalls and you miss data. In production, push fresh items onto a queue and let a separate worker drain it to Slack, so a notification outage never breaks data collection.

Alert wiring for a Twitter monitor: the poll loop puts fresh items on a queue, a separate worker pushes them to Slack, Discord, or a custom webhook

For a visual walkthrough of standing up real-time account tracking end to end, this tutorial covers the same build pattern:

https://www.youtube.com/watch?v=7Bajh0od6hA

The cheapest Twitter API. Try it free.

$0.05 per 1,000 tweets. $0.10 free credits. No credit card required.

Production hardening: the five things that break monitors

Monitoring pipelines fail quietly, and a silent monitor is worse than no monitor because you trust it. Five fixes turn a weekend script into something you can leave running.

First, persist the last-seen ID to durable storage, not memory, so a restart does not replay or skip. Second, add exponential backoff with a cap so a transient error does not hammer the API or get you throttled, start at one second and cap around sixty. Third, decouple polling from processing with a queue so a slow downstream never stalls collection. Fourth, handle the edge cases: deleted tweets, protected accounts, pinned-tweet reordering, and retweets that you may or may not want to treat as new. Fifth, alert on the absence of success, log every cycle and page yourself if no poll has succeeded in N minutes, because in an alerting pipeline the absence of alerts looks identical to "nothing happened."

The first two fixes are a few lines of code, and they are the two that save you at 3am:

import time, json, os

def load_state(path):
    return json.load(open(path)) if os.path.exists(path) else {}

def save_state(path, state):
    json.dump(state, open(path, "w"))

def poll_with_backoff(fn, *args, max_wait=60):
    delay = 1
    while True:
        try:
            return fn(*args)
        except requests.HTTPError as e:
            if delay > max_wait:
                raise
            time.sleep(delay)
            delay = min(delay * 2, max_wait)  # 1, 2, 4, 8 ... capped

Wrapping every poll in poll_with_backoff and persisting state with save_state after each successful cycle turns a fragile script into something you can leave running for months. Independent rate-limit guidance converges on the same backoff-and-cache pattern (Moldstud rate-limit guide).

Production hardening checklist for a Twitter monitor: persist state, backoff with a cap, decouple processing, handle edge cases, and alert on missing polls

Common monitoring mistakes that cause silent failures

A few mistakes show up in almost every first monitor, and each one fails in a way that looks like success until you check. The most common is comparing timestamps instead of IDs. Timestamps can tie, arrive with second-level granularity, or be affected by edits, so a timestamp comparison either double-alerts or skips posts at the boundary. Tweet IDs are monotonic, so comparing IDs is exact. Always track the newest ID, never the newest time.

The second is no first-run guard. If you start the loop with an empty last-seen ID and treat everything as new, your first poll fires an alert for every recent tweet at once. Seed the stored ID on the first run without alerting, then start emitting from the next cycle.

The third is alerting inline with polling. When the notification call is in the same loop as the fetch, a slow or failing webhook stalls collection, and you lose data during the exact incident you most wanted to catch. Decouple them with a queue.

The fourth is ignoring deletions and edits. A tweet you alerted on can be deleted seconds later, and on a compliance or moderation monitor that matters. If your use case needs it, re-check flagged items and emit a follow-up event when they disappear.

The fifth, and the one that quietly defeats the whole exercise, is no dead-man's switch. A monitor that crashes stops alerting, and an alerting pipeline with no alerts is indistinguishable from a quiet day. Log every successful cycle and page yourself when none has landed in a defined window, so a dead monitor announces itself instead of pretending everything is fine.

What monitoring costs in 2026

Cost is where the architecture decision gets made for you. On the official X API, the streaming path to monitoring is gated to legacy or Enterprise access, and pay-per-use reads run about $0.005 each (blotato X API pricing). Reading a million tweets at that per-read rate is roughly $5,000; the same volume on a per-call API at $0.001 per call is a fraction of it. Because one GetXAPI call returns a page of tweets, a per-call read works out to roughly $0.05 per 1,000 tweets versus about $5.00 per 1,000 on the official Pro path.

For a concrete monitor: watching a small set of accounts with a batched search every 30 seconds is on the order of 86,400 calls a month per query, which at $0.001 per call is about $86 a month, with no monthly floor and no developer-account approval to clear. The official equivalent that gives you comparable freshness is a streaming tier new developers can no longer buy into. That gap, not feature parity, is why monitoring keeps migrating to per-call reads.

Work a fuller example. Say you monitor three signals: new tweets from 30 competitor accounts batched into three search queries polled every 30 seconds, mentions of your brand on one query polled every 30 seconds, and profile changes on those 30 accounts checked hourly. The four polling queries run about 86,400 calls each a month, so roughly 345,600 calls; the hourly profile checks add 30 accounts times 720 hours, about 21,600 calls. That is around 367,000 calls a month, or about $367 at $0.001 per call. The official path to the same freshness on streaming is gated to legacy or Enterprise access, out of reach for a new developer. The per-call model is not marginally cheaper here, it is more than an order of magnitude cheaper, and it has no minimum if your usage is smaller.

The reason the per-call number stays sane while the official number does not is the absence of a floor. Pay-per-use on the official API still carries the $0.005 per-read charge and the streaming tier behind a five-figure wall, so the bill grows with both volume and access level. A per-call read API charges only for the calls you make, so the same architecture that costs $86 at one query costs $86, not a five-figure monthly commitment, and scales linearly from there.

Cost to read 1,000 tweets in 2026: the official Pro path around $5.00, a marketplace actor around $0.40, and a per-call API around $0.05

Start monitoring

Monitoring an X account in 2026 comes down to a polling loop over three signals: new tweets via the user-tweets endpoint, mentions via advanced search, and profile changes via the user-info endpoint, each diffed against the last state you stored and pushed to an alert. Streaming is real time but priced for enterprises; polling a cheap read API is what almost everyone actually ships.

GetXAPI gives you those reads with a single bearer token, no developer account, no OAuth, and no monthly minimum, at $0.001 per call. Grab a key, point the loops above at the handles you care about, and wire the alerts. See the pricing page for the current rate card, the cost calculator to model your own poll interval and account count, and the search operators reference to turn the mention loop into full brand monitoring. When you are ready, sign up and run your first poll in minutes.

Build on the monitoring loops above with these guides:

Frequently Asked Questions

Yes. The reliable way to monitor an X account programmatically is to poll a read API on an interval: pull the account's recent tweets, compare against the last tweet ID you saw, and act on anything new. The same pattern covers mentions (search for posts that tag the handle) and profile changes (re-read the user object and diff it). Real-time filtered streaming also exists, but on the official X API it is gated to the legacy Pro tier (now closed to new signups) or Enterprise, so most monitoring is built on polling. With a per-call API like GetXAPI you poll the same public fields at $0.001 per call with no monthly minimum.

Call the user-tweets endpoint for the handle, read the newest tweet ID, and store it. On each poll, fetch again and treat any tweet with an ID greater than your stored value as new. Process those, then update the stored ID. This last-seen-ID pattern avoids duplicate alerts and is more reliable than comparing timestamps, because IDs are monotonic. With GetXAPI it is a single GET to /twitter/user/tweets?userName=HANDLE with a bearer token.

Use the advanced search endpoint with an operator that targets the handle, for example a query like 'to:handle' or '@handle', sorted by latest, and page through results with the cursor. Track the newest tweet ID you have processed so you only alert on fresh mentions. This is how brand-monitoring and support-alerting pipelines catch posts that tag an account without that account having to authenticate.

There is no hard cap when you batch correctly. Polling each account individually scales linearly and gets expensive, so for large lists you switch from per-account timeline polling to search queries that match many accounts in one call, or to a list-based read. The practical limit is your budget and your acceptable latency, not an account ceiling. Watching 10 accounts is trivial; watching 1,000 is a batching and cost-modeling exercise, not a different API.

Polling means you ask the API for new data on a fixed interval (every 10 to 30 seconds, say) and detect changes yourself. Streaming means the platform pushes matching posts to you over a held-open connection in near real time. Streaming gives lower latency but on the official X API it requires the legacy Pro tier (now closed to new signups) or Enterprise. Polling is simpler, cheaper, and good enough for brand monitoring, competitive intelligence, lead-gen, and alerting where a few seconds of delay is fine. For most monitoring jobs, poll.

On the official X API, filtered streaming requires the legacy Pro tier (now closed to new signups) or Enterprise, and the current pay-per-use model bills post reads at about $0.005 each, roughly $5 per 1,000 reads. Polling one account every 30 seconds is roughly 86,400 calls a month; polling 50 accounts that way is millions of calls. On a per-call API priced at $0.001 per call, the same workloads cost a fraction of the official price, and a single batched search call can cover many accounts at once. Cost scales with how often you poll and how many accounts you watch, not a fixed subscription.

Not with a per-call API. The official X API requires a developer account, app approval, and OAuth for many actions. A per-call read API like GetXAPI uses a single bearer token against REST endpoints, so there is no developer-account queue and no OAuth dance for reading public data. You authenticate, call the endpoint, and parse JSON.

Reading public posts for monitoring is a standard, widely used pattern, and a per-call read API returns the same public fields the platform exposes. You are responsible for how you store and use the data, including retention and privacy obligations for your jurisdiction and users. Monitor public accounts and public conversations, respect deletion, and do not try to access protected or private content.

Check out similar blogs

More guides on the Twitter/X API, scraping, and pricing.

Guide to the April 2026 X API pricing change and its effect on developers, bots, and link-posting workflows
X APITwitter API

X API Pricing Change (April 2026): What the $0.20 Per-Link Tweet and Enterprise-Only Limits Mean

X changed its API pricing on April 20, 2026: posts with a URL jumped to $0.20, owned reads dropped to $0.001, and follow/like/quote-post moved to Enterprise-only. Here is what each change costs and what to do next.

GetXAPI·
How to scrape Twitter/X in 2026: an end-to-end workflow for tweets, profiles, followers, search, and media through a per-call read API
Twitter APIX API

How to Scrape Twitter/X in 2026 (Tweets, Profiles, Followers)

How to scrape Twitter/X in 2026: the legal line, why libraries and browser scrapers break, and a runnable per-call API workflow for tweets, profiles, followers, search, and media.

GetXAPI·
Twitter/X API performance benchmark 2026: measured per-endpoint latency, reliability, and throughput across four read endpoints
Twitter APIX API

Twitter API Performance Benchmark 2026: Latency, Reliability, Throughput

A real Twitter/X API performance benchmark: measured per-endpoint latency (p50/p95), 100% reliability across 44 calls, and throughput math, with how it compares to the official API.

GetXAPI·
Twitter bot detection method: the engagement and metadata signals that identify automated X accounts, with API code to pull each one
Twitter Bot DetectionBot Detection

How to Detect X (Twitter) Bots: A Practical, Data-Backed Method

A practitioner method for Twitter bot detection: the real signals (views-to-likes ratio, account age, posting cadence, follower pattern, amplification), runnable API code to pull each one, and a scoring rubric you own.

GetXAPI·
How to scrape the full tweet history of any public X account in 2026, past the 3,200-tweet timeline limit, using date-window search and cursor pagination
Twitter APITweet History

Scrape Full Tweet History of Any Account in 2026 (Beyond the 3,200 Limit)

Why the X timeline stops at 3,200 tweets and how to pull an account's full history with date-window search, cursor pagination, and dedup. Live-tested code in Python and curl.

GetXAPI·
Twitter API cost comparison benchmark for 2026 across GetXAPI, X API v2, twitterapi.io, and Apify
Twitter APIX API

Twitter API Cost per 1,000 Calls: GetXAPI vs Twitter API v2 vs RapidAPI vs Apify, Real Benchmark (2026)

A real Twitter API cost comparison: cost per 1,000 calls across GetXAPI, X API v2, twitterapi.io, Apify, and RapidAPI, with published pricing and a measured benchmark.

GetXAPI·
Is the Twitter API free in 2026, the write-only free tier explained against the full X API pay-per-use cost ladder
Twitter APIX API

Is the Twitter API Free in 2026? What the Free Tier Actually Gives You

The X API free tier is write only: 1,500 posts a month, zero read access. Here is the full 2026 cost ladder and where pay-per-call APIs fit for read-heavy work.

GetXAPI·
Twitter API rate limits explained, the 15-minute and 24-hour windows, 429 responses, and the per-endpoint request budget developers must plan around in 2026
Twitter APIX API

Twitter API Rate Limits Explained: Windows, 429s and How to Avoid Them

The X API enforces 15-minute and 24-hour rate limit windows per endpoint. This guide covers the per-endpoint table, 429 response headers, retry-with-backoff patterns, and how pay-per-use changes (and does not change) your limits.

GetXAPI·