Skip to main content
← Back to blog
by Engineering
cryptokoltutorial

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:

#UsernameFocusWhy Track
1@CryptoHayesMacro / TradingArthur Hayes — former BitMEX CEO, macro calls move markets
2@VitalikButerinEthereum / TechVitalik's mentions of projects cause instant pumps
3@DefiIgnasDeFi / YieldEarly DeFi protocol discovery, detailed threads
4@Pentosh1Technical AnalysisHigh-conviction swing trade calls
5@MustStopMuradMemecoinsMemecoin meta calls with strong community follow
6@inversebrahTrading / CTContrarian calls, often early on reversals
7@coaboronftNFT / CultureNFT alpha and cultural meta shifts
8@CryptoCredTA EducationClean technical setups, educational content
9@0xMert_Solana / InfraSolana ecosystem alpha, infra insights
10@blknoiz06On-chain / TradingOn-chain flow analysis, whale tracking

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.

BASH
export XCROP_API_KEY="your_api_key_here"

Install the requests library if you haven't:

BASH
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.

PYTHON
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

username (required, path param) — the single X username to fetch, e.g. CryptoHayes. Loop the endpoint once per KOL to build a merged feed.
count — results per request (default 20)
cursor — pagination cursor to page through older tweets

Response Format

JSON
{
  "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:

PYTHON
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:

PYTHON
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:

PYTHON
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:

BASH
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:

JAVASCRIPT
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:

PYTHON
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:

PYTHON
# 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:

PYTHON
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

User tweets: 15 credits per tweet returned
Search: 15 credits per tweet

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

Add webhook or Telegram notifications for instant alerts
Combine with [sentiment analysis](/blog/twitter-sentiment-analysis-api) for richer signals
Use the [Write API](/blog/write-api-guide) to auto-reply or bookmark alpha tweets
Track KOL portfolio changes with on-chain data correlation