X (Twitter) Real-Time Monitor: Posts, Follows & Profile Changes avatar

X (Twitter) Real-Time Monitor: Posts, Follows & Profile Changes

Pricing

$20.00 / 1,000 monitoring package credits

Go to Apify Store
X (Twitter) Real-Time Monitor: Posts, Follows & Profile Changes

X (Twitter) Real-Time Monitor: Posts, Follows & Profile Changes

Monitor X posts and account changes via WebSocket or webhook. Solo: 10 accounts for $20 per 30 days. Free demo: @Reuters only, delayed, no history.

Pricing

$20.00 / 1,000 monitoring package credits

Rating

0.0

(0)

Developer

Feedd Labs

Feedd Labs

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

20 days ago

Last modified

Share

Receive collected posts, follows, unfollows, and profile changes from the public X accounts you choose in your app, bot, or dashboard. Delivery time varies by event type, account coverage, and destination.

No X API keys, no scraper to run, and no fee per post.

$20 for 10 accounts for 30 days. The Free demo monitors @Reuters only, about a minute behind, with no history.

Why use it

  • Continuous monitoring. Receive collected events over a WebSocket or webhook, without scheduling a separate run for each check.
  • Straight to Discord, Slack, or Telegram. Posts show up in your channel. Zapier, Make, and n8n work the same way.
  • Replay on paid plans. Resume from a saved cursor to retrieve retained events after a disconnect, within the 30-day retention window.
  • Flat price. $20 covers 10 accounts for 30 days, however much they post.

Quick start

  1. Run the Actor with your accounts. For a paid plan, first set Maximum cost per run to at least $20.02 for Solo (the package charge is $20; the limit needs $0.02 of headroom). On Apify's Free plan, use "users": ["Reuters"] and leave out plan.
{ "action": "track", "users": ["@elonmusk", "@nasa"], "plan": "solo" }
  1. Choose where events go:
    • Discord, Slack, Telegram, Zapier, Make, or n8n: run webhook (see below).
    • Your own app: copy your stream key from the run's OUTPUT (it's shown only once) and connect to wss://ws.feeddlabs.com/stream.

Some accounts take a few minutes to set up. They start on their own.

Send events to Discord, Slack, Telegram, Zapier, Make, or n8n

Run the Actor once with your webhook URL. Collected posts, follows, unfollows, and profile changes are then sent to that destination:

{ "action": "webhook", "webhookUrl": "https://discord.com/api/webhooks/...", "webhookFormat": "discord" }
  • Discord: channel settings, Integrations, Webhooks, New Webhook, Copy Webhook URL. Format discord.
  • Slack: create an incoming webhook for the channel. Format slack.
  • Telegram: create a bot with @BotFather and add it to your channel or group. Pick format telegram and fill in Telegram bot token and Telegram channel or group instead of the URL.
  • Zapier, Make, n8n, or your own app: use their webhook trigger URL. Format json.

Failed webhook deliveries are retried. On paid plans, retained events can be replayed within 30 days. To stop, run webhook with Webhook URL left empty.

Send new posts to Google Sheets or email

You can also use Apify's own integrations, such as Google Sheets or email:

  1. Set Action to fetch and tick Only new since my last run.
  2. Save it as a task and schedule it every few minutes.
  3. Add the integration you want to the task.

Each run sends only what's new since the previous run. Posts arrive only as often as the schedule runs. For delivery without scheduled fetch runs, use a webhook instead.

Later runs

ActionWhat it does
trackAdd accounts to your plan. Add "renew": true for the next 30 days, or a new plan to switch.
fetchExport your 100 newest posts and 30 days of follows, unfollows, and profile changes (paid plans). Tick Only new since my last run to get only what's new.
webhookSend every event to a URL. Leave the URL empty to stop.
statusSee your accounts and when your plan ends.
stopPause an account. Run track to resume it.
removeRemove an account added by mistake and free its spot: { "action": "remove", "user": "@wrong" }. Two per 30 days.
keyGet a new stream key: { "action": "key", "rotateKey": true }.

For developers: the stream

Connect with your key and read: each message is one event. Save each event's cursor. If you disconnect, reconnect with ?after= and your last saved cursor. On paid plans, this resumes retained events after that cursor within the 30-day retention window. Replay covers events we collected; it is not a guarantee that every source event was observed.

JavaScript (Node.js, npm install ws):

import WebSocket from "ws";
let last = null; // keep this somewhere that survives a restart
function connect() {
const url = "wss://ws.feeddlabs.com/stream" + (last ? `?after=${last}` : "");
const ws = new WebSocket(url, {
headers: { authorization: `Bearer ${process.env.FEED_KEY}` },
});
ws.on("message", (raw) => {
const event = JSON.parse(raw);
if (event.type === "error") return console.error(event.code);
if (event.type === "ready") return;
console.log(event.type, event.account.username);
last = event.cursor;
});
ws.on("close", () => setTimeout(connect, 2000));
}
connect();

Python (pip install websockets):

import asyncio, json, os, websockets
last = None # keep this somewhere that survives a restart
async def main():
global last
while True:
url = "wss://ws.feeddlabs.com/stream" + (f"?after={last}" if last else "")
try:
async with websockets.connect(
url,
additional_headers={"Authorization": f"Bearer {os.environ['FEED_KEY']}"},
) as ws:
async for raw in ws:
event = json.loads(raw)
if event["type"] in ("ready", "error"):
continue
print(event["type"], event["account"]["username"])
last = event["cursor"]
except websockets.ConnectionClosed:
pass
await asyncio.sleep(2)
asyncio.run(main())

Reconnecting without ?after= continues after the last event we sent you.

Checking webhook requests

JSON webhook requests carry x-feedd-signature: sha256=..., an HMAC-SHA256 of x-feedd-timestamp + "." + body with the secret from the webhook run's OUTPUT (shown once).

What you get

Every event has the same top part:

FieldMeaning
idUnique event ID. If you ever see the same id twice (after a reconnect), keep one.
cursorPosition in your stream. Reconnect with ?after= and the last one you saved to continue right after it.
timeWhen we saw it (UTC).
typepost, follow, unfollow, or profile
accountThe tracked account: id, username, and name

A new post

{
"id": "K9yTVRR90AAQ4-99tF3_3w",
"cursor": "1978296",
"time": "2026-10-09T23:39:24.992Z",
"type": "post",
"account": { "id": "17469289", "username": "nypost", "name": "New York Post" },
"post": {
"id": "2108703910336565304",
"url": "https://x.com/nypost/status/2108703910336565304",
"kind": "post",
"text": "Steph Curry drops truth bomb on Warriors' front office failure https://trib.al/AsPoEod",
"links": [],
"images": ["https://pbs.twimg.com/media/HUOfBvVXYAAepm_.jpg"],
"videos": [],
"created_at": "2026-10-09T23:39:24.705Z",
"complete": true,
"reference": null
}
}

kind is post, reply, quote, or repost. For replies, quotes, and reposts, reference holds the other post:

"reference": {
"type": "replied_to",
"id": "2108703611391979810",
"username": "holdenhalford",
"text": "@bot claim holden@mail.grokbot.com for me",
"images": [],
"videos": []
}

A follow or unfollow

{
"id": "x5ON5dXuUJIzRZozDEjVS2",
"cursor": "1978239",
"time": "2026-10-09T23:38:35.079Z",
"type": "follow",
"account": { "id": "1101117625738899458", "username": "skyiszen", "name": "Sky" },
"target": {
"id": "180107694",
"username": "kaitlancollins",
"name": "Kaitlan Collins",
"bio": "Chief White House Correspondent and Anchor of The Source at 9 p.m., @CNN"
}
}

A profile change

{
"id": "S6txBPC-9ga010La948bnq",
"cursor": "1978236",
"time": "2026-10-09T23:38:27.514Z",
"type": "profile",
"account": { "id": "17454769", "username": "glennbeck", "name": "Glenn Beck" },
"changes": [
{ "field": "pinned_post", "before": null, "after": "2108355025483583891" }
]
}

field is one of username, name, bio, location, website, avatar, banner, or pinned_post.

If something goes wrong

The stream sends {"type": "error", "code": "..."} and closes:

CodeWhat to do
NO_ACTIVE_ENTITLEMENTYour plan ended. Run track with "renew": true.
CURSOR_EXPIREDYou were away over 30 days. Reconnect to wss://ws.feeddlabs.com/stream?reset=1.
INVALID_CURSORThat cursor isn't from your stream. Reconnect without ?after=.
STREAM_KEY_DENIEDWrong or old key. Run key with "rotateKey": true.
HTTP 429 or 503Wait a few seconds and reconnect.

Pricing

PlanAccountsPrice for 30 days
Free demo@Reuters only$0, about a minute behind, no history
Solo10$20
Team50$80
Desk150$200
Fleet500$500
  • Free: if you have a free Apify account, run track with "users": ["Reuters"] and leave out plan. Other accounts require a paid monitoring package.
  • Paid plans need a paid Apify subscription. The price is the same whichever one you have.

FAQ

Do I need X (Twitter) API keys? No. Everything runs on our side.

What if my server goes down? Reconnect with the same key and your last saved cursor. Paid plans can replay collected events retained for up to 30 days. The Free plan has no history replay.

Can I add or swap accounts? You can add accounts any time until you reach your plan's number (10 on Solo). An account you stop still counts until your next 30 days start. Added the wrong one by mistake? remove frees its spot right away, twice per 30 days.

Can I track private accounts? No, only public ones.

Can AI agents use it? Yes. Add https://mcp.apify.com?tools=feeddlabs/x-twitter-user-tracker to Claude, ChatGPT, or Cursor and ask, for example, "Which accounts am I tracking, and when does my plan end?"

Something not right? Write it in Report a problem and run the Actor. The run is free and does nothing else. AI agents can report problems too.

More from Feedd Labs

ActorWhat it does
X (Twitter) Real-Time MonitorPosts and account changes delivered by WebSocket or webhook
X (Twitter) Search ScraperTweets and replies by keyword, account and date
X (Twitter) Followers ScraperFollowers, following and profiles of public accounts
X (Twitter) Account WatchWho an account follows or unfollows, and its profile changes
X (Twitter) Ads LibraryCollected promoted ads and brand creative
Mainstream News Live & ArchiveCollected news articles from major outlets
US Stock Market Data1-minute stock history since 2016, futures and financial statements
Crypto Derivatives DataOpen interest, funding and liquidations on 4 exchanges
Crypto OHLCV & TradesCandles from 1 second to 1 day and individual trades
Polymarket DataAvailable odds history, volume and open interest by event