The Account Activity API (AAA) was X's webhook for account events: new posts, direct messages, likes, follows and blocks, sent to your server as they happened. X now marks it as deprecated in its documentation and points to the X Activity API (XAA) instead. If you still run on AAA, or found it in an old tutorial, this post shows where each use case goes now.
What the Account Activity API did
AAA sent events for accounts you owned or that had subscribed to your app. A user authorized your app, you subscribed their account to your webhook, and from then on X pushed that account's activity to you. It was built for apps acting on behalf of their users: support inboxes, DM bots, follower tools.
It was never a way to watch accounts that had not authorized you. That is the part many people searched for it to do.
What replaces it: the X Activity API
The X Activity API delivers activity events over a webhook or a persistent HTTP stream. You filter by user_id. For posts it has these events:
| Event | Fires when |
|---|---|
post.create | The user posts, replies, quotes or reposts |
post.delete | The user deletes a post |
post.mention.create | Someone @mentions the user |
post.reply.create | Someone replies directly to the user's post |
post.quote.create | Someone quotes the user's post |
post.repost.create | Someone reposts the user's post |
X bills each delivered post event as a post; its pricing page lists $0.005 per new-post webhook event (post.create)as of Oct 2026. Private events, such as likes, need the user's authorization (OAuth 2.0 user context). Posts from protected accounts are not delivered.
Which tool fits which job
| You want | Use |
|---|---|
| DMs, likes, follows of your own users | X Activity API with user authorization. Third-party data providers cannot do this. |
| New posts of public accounts you do not own | X Activity API post.create, billed per event, or a monitoring plan, billed per month |
| Mentions and replies to an account | X Activity API mention and reply events, or poll search for @username with since_id |
| Keywords, hashtags, cashtags | X filtered stream, or poll search with since_id |
For anything that involves a user's private activity or acting on their behalf, stay with X. It is the only source for that data.
New posts of public accounts: per event or per month
If what you used AAA for, or wanted it for, is "tell me when these accounts post", a monitoring plan is the simpler route. You add the accounts, set a webhook and receive every new post as a signed event. There is no app at console.x.com and no user authorization, because the posts are public.
The bill is a flat monthly fee per plan, so it does not grow when the accounts post more:
| Accounts | Standard (60 s) | Fast (5 s) | Real-time (1 s) |
|---|---|---|---|
| 10 | $5 | $9 | $19 |
| 50 | $15 | $29 | $59 |
| 250 | $49 | $99 | $199 |
| 1,000 | $149 | $299 | $599 |
| 5,000 | $499 | $999 | $1,999 |
Each account is checked at least every 60 s, 5 s or 1 s, depending on the class. We compare the two billing models with numbers in X API webhooks for new posts, and the webhook guide sets it up in Python.
What a monitoring plan does not do: it sends new posts, not deletions, mentions, likes or follows. If you need those events, the X Activity API covers them.
Mentions and replies without a webhook
To follow what people say to an account, search works well. Every post that mentions @NASA or replies to it is found with:
@NASA OR to:NASAPoll it with category=Latest and pass the newest ID you have seen as since_id, so each call returns only new posts:
import os
import time
import requests
API = "https://api.twittrapi.com"
HEADERS = {"X-API-KEY": os.environ["TWITTRAPI_API_KEY"]}
def poll(query: str, newest: str | None) -> str | None:
"""Print posts newer than `newest` and return the new newest ID."""
q = f"{query} since_id:{newest}" if newest else query
params = {"query": q, "category": "Latest", "format": "simple"}
page = requests.get(f"{API}/search", headers=HEADERS, params=params, timeout=30).json()
for t in reversed(page["data"]): # oldest first
print(t["author"]["username"], t["text"][:80])
return page["data"][0]["id"] if page["data"] else newest
newest = None
while True:
newest = poll("@NASA OR to:NASA", newest)
time.sleep(60)Each poll is one call, from $0.065 per 1,000 calls. One poll a minute is about 43,000 calls a month. The search guide lists the operators.
Frequently asked questions
Is the Twitter Account Activity API still available?
X lists it as deprecated and recommends the X Activity API for real-time activity. Check X's documentation for the dates that apply to your app.
Can the Account Activity API watch any account?
No. It sent events for accounts you owned or that had subscribed to your app. To watch public accounts that have not authorized you, use the X Activity API's post events or a monitoring plan.
Do I need a developer account for the X Activity API?
Yes. It is part of the official X API, so you need an app at console.x.com.
Can a third-party API read my users' direct messages?
Not on their behalf. Private data such as DMs and likes needs the user's authorization through the official API.
Sources
- Account Activity API introduction (docs.x.com, deprecation notice)
- X Activity API introduction (docs.x.com, event types, billing, privacy)
- Account monitoring docs
TwittrAPI is not affiliated with X Corp. It reads only public data.



