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();
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"
]);
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"
]);
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
- API key: lunarcrush.com/developers
- API docs: lunarcrush.com/developers/api
- MCP server (use with Claude): lunarcrush.com/products/lunarcrush-mcpserver
I'm building a bunch of small projects like this. Follow along if you're into this kind of thing.
Top comments (0)