In crypto, a post from a founder, an exchange or a project account can move a price before the news reaches anywhere else. If your bot or your desk reacts to those posts, the question is how many seconds pass between the post and your code seeing it.

This guide covers two sources: account monitoring for the accounts you already know, and cashtag search for everything else on X. The crypto trading page gives the overview; this post has the code.

Step 1: Choose the accounts and the speed

Start with a short list of accounts whose posts you act on: project and team accounts, exchanges (listings, delistings, maintenance), founders, and a few analysts. Watch them by username or user ID. There is no follower minimum, so a small project account is checked as often as an exchange with millions of followers.

The speed class sets how often each account is checked:

ClassGuaranteeTypical
StandardWe check at least every 60 s15–60 s
FastWe check at least every 5 s2–5 s
Real-timeWe check at least every 1 s0.5–1 s

For trading, the Real-time class is the one that matters. It costs $19 a month for 10 accounts and $59 for 50:

AccountsStandard (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

Book the plan under Monitors in the dashboard and add the accounts:

import os
import requests
 
API = "https://api.twittrapi.com"
HEADERS = {"X-API-KEY": os.environ["TWITTRAPI_API_KEY"]}
 
accounts = ["binance", "coinbase", "solana", "VitalikButerin"]
r = requests.post(f"{API}/monitors/accounts", headers=HEADERS, json={"usernames": accounts}, timeout=30)
for result in r.json()["data"]:
    print(result["input"], result.get("status") or result.get("error"))

Step 2: Receive the posts and pick out cashtags

Set your webhook as shown in the webhook guide and verify every request's signature. Then extract the cashtags from the text. The tweet object has a hashtags list, but no separate field for cashtags, so match them in the text:

import re
from datetime import datetime
 
CASHTAG = re.compile(r"(?<![\w$])\$([A-Za-z][A-Za-z0-9]{1,9})\b")
WATCH = {"BTC", "ETH", "SOL"}
 
 
def handle(event: dict) -> None:
    tweet = event["tweet"]
    if tweet.get("retweetOf"):
        return  # skip reposts, keep originals, replies and quotes
    tags = {m.upper() for m in CASHTAG.findall(tweet["text"])}
    hits = tags & WATCH
    created = datetime.fromisoformat(event["tweetCreatedAt"].replace("Z", "+00:00"))
    detected = datetime.fromisoformat(event["detectedAt"].replace("Z", "+00:00"))
    lag = (detected - created).total_seconds()
    print(f"{tweet['author']['username']} {sorted(hits) or '-'} {lag:.1f}s {tweet['url']}")

Call handle(event) from your webhook handler after the signature check, and answer the webhook before you do anything slow such as placing an order. Posts with no cashtag still arrive, because an exchange announcing a listing does not always use one. Decide per account whether you need the tag.

Step 3: Measure your latency

tweetCreatedAt comes from X, detectedAt is when we saw the post. The difference is the detection delay: X's own delay before a post appears, plus our check interval. The lag printed above shows it for every event. Log it for a few days before you rely on a number, and add the time your webhook needs to reach your server.

X's timestamps have one-second precision, so a lag below one second can show as 0 or 1.

Monitoring follows accounts. To catch a cashtag from accounts you do not know yet, poll search with category=Latest and since_id, so each call returns only posts you have not seen:

import time
 
 
def poll(query: str, newest: str | None) -> str | None:
    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"]):
        print(t["author"]["username"], t["text"][:80])
    return page["data"][0]["id"] if page["data"] else newest
 
 
newest = None
while True:
    newest = poll("$SOL -filter:retweets min_faves:5", newest)
    time.sleep(15)

min_faves:5 keeps out most spam. Every poll is one call, from $0.065 per 1,000 calls; one query every 15 seconds is about 173,000 calls a month. The search guide lists more operators.

Send it where you trade

To get the posts in a Telegram group or a Discord channel instead of a log, use the relay from tweet alerts in Discord, Telegram or Slack and call wanted() with your cashtag check.

Frequently asked questions

How fast are crypto tweet alerts?

The Real-time class checks each account at least once per second. X's own delay before a post appears comes on top. Compare tweetCreatedAt and detectedAt on your events to see what you get.

Can I track a cashtag like $BTC directly?

Not with account monitoring, which follows accounts. Poll search for the cashtag with since_id, as in step 4, or watch the accounts that usually post about it.

Can I watch small project accounts?

Yes. There is no follower minimum. Every public account in your plan is checked at the same interval.

Is this trading advice?

No. This post shows how to get public posts quickly. What you do with them is your decision.

Sources

TwittrAPI is not affiliated with X Corp. It reads only public data.