How to Track Crypto KOLs on Twitter with API
Why Track Crypto KOLs on Twitter?
In crypto, information asymmetry is everything. The traders and influencers who move markets — known as Key Opinion Leaders (KOLs) — often telegraph their moves on Twitter before price action happens. A single tweet from a top KOL can send a token 50x in hours.
Manually refreshing 20+ Twitter profiles is not a strategy. You need a programmatic approach: a twitter KOL tracking tool that monitors multiple influencers in real-time and alerts you when something important drops.
This tutorial shows you how to build exactly that using the XCROP API — a crypto influencer API that gives you direct access to Twitter data without scraping headaches.
Top 10 Crypto KOLs to Track
Before writing code, here are 10 high-signal accounts worth monitoring:
Getting Started
You need an XCROP API key. Sign up at [xcrop.io](https://xcrop.io) — the free tier gives you 5,000 credits to start.
export XCROP_API_KEY="your_api_key_here"
Install the requests library if you haven't:
pip install requests
Method 1: Merged KOL Feed
The most flexible way to track crypto KOLs on Twitter is the /v2/users/:username/tweets endpoint: pull each KOL's latest tweets and merge them into a single chronological feed. A few lines of code gives you a custom "For You" feed with only the accounts you care about — and no cap on how many KOLs you follow.
import requests import os API_KEY = os.environ["XCROP_API_KEY"] BASE = "https://xcrop.io/api/v2" HEADERS = {"Authorization": "Bearer " + API_KEY} # Fetch each KOL's timeline and merge into one feed KOLS = ["CryptoHayes", "DefiIgnas", "Pentosh1", "inversebrah"] data = [] for kol in KOLS: response = requests.get( f"{BASE}/users/{kol}/tweets", headers=HEADERS, params={"count": 20} ) data += response.json().get("data", []) data.sort(key=lambda t: t["createdAt"], reverse=True) for tweet in data: author = tweet["author"]["username"] likes = tweet["metrics"]["likes"] print("@" + author + " (" + str(likes) + " likes)") print(" " + tweet["text"][:140]) print()
This returns the latest tweets from all four KOLs, sorted chronologically. Each tweet includes full metrics (likes, retweets, views, bookmarks).
Parameters
CryptoHayes. Loop the endpoint once per KOL to build a merged feed.Response Format
{ "data": [ { "id": "1234567890", "text": "BTC looking strong above $95k...", "created_at": "Mon Mar 02 16:01:37 +0000 2026", "author": { "id": "123456", "username": "CryptoHayes", "name": "Arthur Hayes" }, "metrics": { "likes": 5200, "retweets": 890, "replies": 340, "views": 1200000, "bookmarks": 120 } } ], "meta": { "total": 20, "next_cursor": "...", "has_next_page": true } }
Method 2: Individual User Tweets
For deeper monitoring of a single KOL, use the /v2/users/{username}/tweets endpoint:
def get_user_tweets(username, count=20): """Fetch recent tweets from a specific user.""" response = requests.get( BASE + "/users/" + username + "/tweets", headers=HEADERS, params={"count": count} ) if response.status_code == 200: return response.json()["data"] return [] # Get CryptoHayes' latest tweets tweets = get_user_tweets("CryptoHayes", count=10) for t in tweets: print(t["created_at"] + " | " + t["text"][:100])
Method 3: Search for KOL Mentions
Sometimes you want to find what KOLs are saying about a specific token. Combine search with username filters:
def search_kol_mentions(token, kols): """Search for KOL tweets mentioning a specific token.""" # Build search query with KOL filter kol_filter = " OR ".join(["from:" + k for k in kols]) query = token + " (" + kol_filter + ")" response = requests.post( BASE + "/search", headers=HEADERS, json={ "query": query, "count": 20, "sort": "latest" } ) return response.json().get("data", []) # Find what top KOLs are saying about $SOL kol_list = ["CryptoHayes", "Pentosh1", "0xMert_"] mentions = search_kol_mentions("$SOL", kol_list) for tweet in mentions: print("@" + tweet["author"]["username"] + ": " + tweet["text"][:120])
Building a KOL Monitor with Alerts
Here's a complete Python script that polls KOL tweets and prints alerts when high-engagement tweets are detected:
import requests import os import time API_KEY = os.environ["XCROP_API_KEY"] BASE = "https://xcrop.io/api/v2" HEADERS = {"Authorization": "Bearer " + API_KEY} # Configuration KOLS = "CryptoHayes,DefiIgnas,Pentosh1,inversebrah,MustStopMurad" POLL_INTERVAL = 60 # seconds ENGAGEMENT_THRESHOLD = 500 # minimum likes to alert seen_ids = set() def check_kol_tweets(): """Poll KOL timeline and alert on new high-engagement tweets.""" tweets = [] for kol in KOLS.split(","): response = requests.get( f"{BASE}/users/{kol}/tweets", headers=HEADERS, params={"count": 20} ) if response.status_code != 200: print("[ERROR] API returned " + str(response.status_code) + " for @" + kol) continue tweets += response.json().get("data", []) for tweet in tweets: tweet_id = tweet["id"] if tweet_id in seen_ids: continue seen_ids.add(tweet_id) likes = tweet["metrics"]["likes"] retweets = tweet["metrics"]["retweets"] views = tweet["metrics"]["views"] author = tweet["author"]["username"] # Alert on high engagement if likes >= ENGAGEMENT_THRESHOLD: print("=" * 60) print("[ALERT] High-engagement tweet from @" + author) print("Likes: " + str(likes) + " | RTs: " + str(retweets) + " | Views: " + str(views)) print(tweet["text"][:280]) print("https://twitter.com/" + author + "/status/" + tweet_id) print("=" * 60) print() # Detect buy signals text_lower = tweet["text"].lower() buy_keywords = ["just bought", "loading up", "accumulating", "aping in", "bullish"] if any(kw in text_lower for kw in buy_keywords): print("[SIGNAL] Possible buy signal from @" + author) print(" " + tweet["text"][:200]) print() def main(): print("KOL Monitor started. Tracking: " + KOLS) print("Poll interval: " + str(POLL_INTERVAL) + "s") print("Alert threshold: " + str(ENGAGEMENT_THRESHOLD) + " likes") print() while True: try: check_kol_tweets() except Exception as e: print("[ERROR] " + str(e)) time.sleep(POLL_INTERVAL) if __name__ == "__main__": main()
Save this as kol_monitor.py and run:
export XCROP_API_KEY="your_key" python kol_monitor.py
JavaScript Variant
The same polling loop in Node.js, using a Set for dedup across polls:
const seenIds = new Set(); const KOLS = ["CryptoHayes", "DefiIgnas", "Pentosh1", "inversebrah"]; async function checkKolTweets() { const feeds = await Promise.all(KOLS.map(kol => fetch(`https://xcrop.io/api/v2/users/${kol}/tweets?count=20`, { headers: { "Authorization": "Bearer " + apiKey } }).then(r => r.json()) )); for (const tweet of feeds.flatMap(f => f.data || [])) { if (seenIds.has(tweet.id)) continue; seenIds.add(tweet.id); if (tweet.metrics.likes >= 500) { console.log("[ALERT] @" + tweet.author.username + " — " + tweet.metrics.likes + " likes"); console.log(" " + tweet.text.slice(0, 200)); } } } setInterval(checkKolTweets, 60000); checkKolTweets();
> Tip: Polling adds latency proportional to your interval — for time-sensitive strategies where seconds matter, a streaming (SSE) connection that pushes new tweets as they're indexed is a lower-latency alternative worth evaluating.
Optimizing Your KOL Tracker
Group KOLs by Category
Separate your KOL lists by trading style so you can weight signals differently:
KOL_GROUPS = { "defi_alpha": ["DefiIgnas", "Pentosh1"], "macro_traders": ["CryptoHayes", "inversebrah"], "memecoin": ["MustStopMurad"], "solana": ["0xMert_"] }
Engagement Spike Detection
A tweet getting 10x a KOL's average engagement is a stronger signal than raw like count:
# Track rolling averages per KOL kol_averages = {} def is_engagement_spike(tweet, multiplier=5): author = tweet["author"]["username"] likes = tweet["metrics"]["likes"] if author not in kol_averages: kol_averages[author] = likes return False avg = kol_averages[author] # Update rolling average kol_averages[author] = avg * 0.9 + likes * 0.1 return likes > avg * multiplier
Viral Detection
Views-to-likes ratio is another useful heuristic alongside raw engagement — a tweet where likes are unusually high relative to views suggests a tightly-engaged audience reacting fast, often an early signal before wider virality:
def is_viral(tweet, ratio_threshold=0.05): likes = tweet["metrics"]["likes"] views = tweet["metrics"]["views"] return views > 0 and likes / views > ratio_threshold
Credit Usage & Recommended Plan
For continuous KOL monitoring (polling every 60s, 20 tweets per poll), you'll use roughly ~430K credits/day. The Pro plan ($9.9/mo, 2M credits) covers moderate tracking. For 24/7 monitoring of multiple groups, purchase top-up credit packs for additional capacity.