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, or KOLs) often telegraph their moves on Twitter before the price does. A single tweet from a top KOL can send a token up 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 the 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; 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 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
Likes-to-views 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.
Next Steps
One API for X/Twitter data: profiles, tweets, followers, search and real-time streams. Start free with 5,000 credits/month, no card required.