DEV Community

Joe Vezzani
Joe Vezzani

Posted on • Originally published at lunarcrush.com

The Real X Creator Rankings for 2026 (With Code to Pull Them Yourself)

Most rankings of X accounts use follower count. That tells you almost nothing about who actually drives conversation on the platform.

LunarCrush processes 50M+ social posts per hour across X, Reddit, TikTok, YouTube, Instagram, and 10K+ news sources. We ranked every X account by actual engagements (likes, reposts, replies, quotes, impressions) for 2026. The results are surprising.

GitHub repo: JoeVezzani/x-creator-rankings

X post: @joevezz

The Top 25 by 2026 Engagements

Rank Creator Category Followers Engagements
1 @elonmusk Tech 237.8M 54.4B
2 @PopBase Entertainment 2.9M 7.7B
3 @MarioNawfal News 3.3M 7.3B
4 @narendramodi Politics 106.6M 7.2B
5 @FabrizioRomano Sports 27.2M 5.9B
6 @centralreality Geopolitics 1.3M 5.7B
7 @DiscussingFilm Entertainment 2.8M 5.3B
8 @TheCinesthetic Entertainment 1.6M 5.1B
9 @Rainmaker1973 Science 4.3M 3.8B
10 @PopCrave Entertainment 3.0M 3.5B
11 @EricLDaugh Politics 1.0M 3.5B
12 @Variety Entertainment 3.2M 3.4B
13 @sciencegirl Science 5.8M 3.3B
14 @nypost News 3.7M 3.2B
15 @Polymarket Brand 1.4M 3.2B
16 @TouchlineX Sports 1.6M 3.0B
17 @starlink Tech 1.6M 3.0B
18 @WhiteHouse Politics 4.4M 2.7B
19 @tmz Entertainment 8.6M 2.7B
20 @bosunatiklama Entertainment 1.3M 2.6B
21 @Dexerto Entertainment 1.3M 2.5B
22 @BRICSinfo Geopolitics 2.0M 2.4B
23 @FilmUpdates Entertainment 1.4M 2.4B
24 @cristiano Sports 106.6M 2.4B
25 @foxnews News 28.7M 2.3B

You have to get to #11 before you find a partisan political commentator. The top 10 is entertainment, news, sports, science, and tech.

@cristiano has 106M followers but ranks 24th. @centralreality has 1.3M followers and ranks 6th with 2.5x more engagement. Follower count is not engagement.

Pull This Data Yourself

The LunarCrush API exposes creator-level data for any public X account.

const API_KEY = process.env.LUNARCRUSH_API_KEY;

async function getCreator(network, username) {
  const res = await fetch(
    `https://lunarcrush.com/api4/public/creator/${network}/${username}/v1`,
    { headers: { Authorization: `Bearer ${API_KEY}` } }
  );
  return res.json();
}

async function main() {
  const creator = await getCreator("twitter", "PopBase");

  console.log(`\n${creator.data?.display_name} (@${creator.data?.screen_name})`);
  console.log(`Followers: ${creator.data?.followers_count?.toLocaleString()}`);
  console.log(`Engagements (24h): ${creator.data?.interactions?.toLocaleString()}`);
  console.log(`CreatorRank: ${creator.data?.creator_rank}`);
  console.log(`Posts tracked: ${creator.data?.num_posts}`);
}

main();
Enter fullscreen mode Exit fullscreen mode

Compare Creators Head-to-Head

async function compareCreators(usernames) {
  const results = [];

  for (const username of usernames) {
    const data = await getCreator("twitter", username);
    results.push({
      name: data.data?.display_name || username,
      username,
      followers: data.data?.followers_count || 0,
      engagements: data.data?.interactions || 0,
      rank: data.data?.creator_rank || 0,
    });
  }

  results.sort((a, b) => b.engagements - a.engagements);

  console.log(`\nCreator Comparison:\n`);
  for (const r of results) {
    const ratio = r.followers > 0
      ? (r.engagements / r.followers).toFixed(1) : "N/A";
    console.log(
      `  @${r.username.padEnd(20)} ` +
      `${r.engagements.toLocaleString().padStart(15)} eng | ` +
      `${r.followers.toLocaleString().padStart(12)} followers | ` +
      `ratio: ${ratio}x | rank: #${r.rank}`
    );
  }
}

compareCreators([
  "PopBase", "Cristiano", "FabrizioRomano",
  "Rainmaker1973", "Polymarket", "NASA"
]);
Enter fullscreen mode Exit fullscreen mode

The engagement-to-follower ratio reveals who is actually resonating. @PopBase gets 2,638x its follower count in engagements. @nasa gets 9.2x. Both are valuable, but they serve completely different purposes.

Build an Alert for Rising Creators

const fs = require("fs");
const STATE_FILE = "./creator_state.json";

function loadState() {
  try { return JSON.parse(fs.readFileSync(STATE_FILE)); }
  catch { return {}; }
}

function saveState(state) {
  fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
}

async function checkForRising(usernames) {
  const state = loadState();

  for (const username of usernames) {
    const data = await getCreator("twitter", username);
    const current = data.data?.interactions || 0;
    const previous = state[username]?.engagements || 0;

    if (previous > 0 && current > previous * 1.5) {
      console.log(
        `RISING: @${username} engagements jumped ` +
        `${previous.toLocaleString()} -> ${current.toLocaleString()} ` +
        `(${((current/previous - 1) * 100).toFixed(0)}% increase)`
      );
    }

    state[username] = {
      engagements: current,
      timestamp: new Date().toISOString()
    };
  }

  saveState(state);
}

checkForRising([
  "PopBase", "MarioNawfal", "Rainmaker1973",
  "Polymarket", "KobeissiLetter", "sciencegirl"
]);
Enter fullscreen mode Exit fullscreen mode

Run on a cron. When a creator's engagement spikes 50%+, you get alerted. Useful for spotting breaking news, viral moments, or emerging narratives.

Try It

I'm building a bunch of small projects like this. Follow along if you're into this kind of thing.

Top comments (0)