Every World Cup there's a moment. Some player nobody outside their domestic league had heard of scores an absolute screamer in a knockout match, and by the time they've finished celebrating, their follower count is climbing like a rocket.
I always found that fascinating, but I could never see it happening. By the time the "X gained 3M followers!" tweets show up, the surge is already over. So this tournament I built a little tracker that snapshots player follower counts on a schedule and shows me the growth curve in near real-time.
Here's how it works.
The problem with doing this "properly"
My first instinct was the official APIs. That died fast.
- Instagram's Graph API won't give you follower counts for accounts you don't own.
- TikTok's Research API is academics-only and takes weeks of applications.
- X's API now starts at $100/month and climbs steeply from there.
I just wanted public follower counts — numbers anyone can see by opening the app. I didn't want a data partnership and a legal review.
I ended up using the SociaVault API, which wraps public profile data from each platform behind one key. One request, one credit, JSON back.
The shared client
Everything runs through one tiny helper:
// Node 18+ has fetch built in
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = "https://api.sociavault.com";
async function sv(path, params) {
const url = new URL(BASE + path);
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const res = await fetch(url, { headers: { "X-API-Key": API_KEY } });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
return res.json();
}
Grabbing follower counts across platforms
Each platform nests the count slightly differently, so I use fallback chains to stay defensive:
async function instagramFollowers(username) {
const data = await sv("/v1/scrape/instagram/profile", { username });
const p = data.data?.user ?? data.data ?? data;
return p.follower_count ?? p.edge_followed_by?.count ?? null;
}
async function tiktokFollowers(username) {
const data = await sv("/v1/scrape/tiktok/profile", { username });
const stats = data.stats ?? data.user?.stats ?? {};
return stats.followerCount ?? null;
}
async function xFollowers(username) {
const data = await sv("/v1/scrape/twitter/profile", { username });
const u = data.user ?? data.data ?? data;
return u.followers_count ?? null;
}
Snapshot a whole watchlist at once
I keep a list of players and their handles, then snapshot everyone in one pass. Promise.allSettled means one bad lookup never sinks the whole run:
const watchlist = [
{ name: "Breakout Striker", ig: "player_ig", tiktok: "player_tt", x: "player_x" },
// add as many as you want
];
async function snapshot() {
const ts = new Date().toISOString();
const results = await Promise.allSettled(
watchlist.map(async (p) => ({
name: p.name,
ts,
ig: await instagramFollowers(p.ig),
tiktok: await tiktokFollowers(p.tiktok),
x: await xFollowers(p.x),
}))
);
return results.filter(r => r.status === "fulfilled").map(r => r.value);
}
Append each run to a CSV (or a real DB), run it on a cron every hour during the tournament, and within a couple of matches you've got a clean time series.
The fun part: spotting the breakout
The story lives in the percentage growth, not the absolute numbers. A superstar gaining 500k followers is a smaller relative event than an unknown gaining 500k off a base of 200k. Sort your deltas by percentage growth and the breakout players float right to the top — usually before the mainstream "look who blew up" posts even start.
Cost
Each profile lookup is one credit. A watchlist of 20 players across 3 platforms, snapshotted hourly for a month, is cheap — a rounding error next to what enterprise social tools charge.
Want the full version?
I wrote up the complete build — CSV logging, surge-detection math, charting — on the SociaVault blog: Tracking Player Social Growth During the World Cup. There's also a more story-driven piece on why these follower surges happen.
Grab a free key at sociavault.com — you get 50 credits, plenty to pilot a watchlist.
What would you point this at? I'm tempted to run the same setup on a Formula 1 season next.
Top comments (0)