How to Vet a Creator's Last 90 Days Before You Sign (With Code)
A creator's media kit shows you their best month. What you actually want is their last three months, the real, unedited run of posts that tells you whether the engagement is steady or propped up by one viral fluke, whether they post consistently or vanish for weeks, and how much of their feed is already sponsored. That data is public. You can pull it and run the checks in a few minutes instead of trusting a PDF.
This is the code-first companion to the creator due diligence checklist. The checklist tells you what to review; this shows you how to compute it from a creator's real recent history.
What "last 90 days" gets you that a media kit doesn't
A media kit is a highlight reel. Ninety days of actual posts shows the pattern: the median post (not the peak), the rhythm, the sponsored load, and any recent collapse in reach. Those four things predict how a paid post will perform far better than a cherry-picked "average views" number.
We'll pull it with SociaVault. New accounts get 50 free credits, and each call is one credit.
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = "https://api.sociavault.com/v1";
async function getProfile(handle) {
const res = await fetch(
`${BASE}/scrape/instagram/profile?handle=${encodeURIComponent(handle)}`,
{ headers: { "x-api-key": API_KEY } },
);
return (await res.json()).data?.user;
}
async function getPosts(handle) {
const res = await fetch(
`${BASE}/scrape/instagram/posts?handle=${encodeURIComponent(handle)}`,
{ headers: { "x-api-key": API_KEY } },
);
return (await res.json()).data?.items ?? [];
}
Filter the posts to the last 90 days by their taken_at timestamp and you've got your working set.
Check 1: engagement consistency (median, not average)
The single most important number, and the one media kits fudge. Average engagement gets inflated by one viral post. The median tells you what a typical post from this creator does, which is what your sponsored post will most likely do.
function engagementStats(posts, followers) {
const eng = posts.map((p) => (p.like_count ?? 0) + (p.comment_count ?? 0));
const sorted = [...eng].sort((a, b) => a - b);
const median = sorted[Math.floor(sorted.length / 2)] ?? 0;
const avg = eng.reduce((a, b) => a + b, 0) / (eng.length || 1);
return {
medianEngagement: median,
avgEngagement: Math.round(avg),
medianRate: followers ? (median / followers) * 100 : null, // %
outlierGap: avg / (median || 1), // >2 means avg is outlier-driven
};
}
If outlierGap is well above 2, their "average" is riding on flukes, judge them by the median. Compare the medianRate to your platform norms; what's a good engagement rate on Instagram has the benchmarks.
Check 2: posting cadence
A creator who posts daily and one who posts twice a month are different investments, even at the same follower count. Measure the gaps:
function cadence(posts) {
const times = posts.map((p) => new Date(p.taken_at).getTime()).sort((a, b) => b - a);
if (times.length < 2) return { postsPerWeek: 0, longestGapDays: null };
const gaps = [];
for (let i = 1; i < times.length; i++) gaps.push((times[i - 1] - times[i]) / 86400000);
const spanDays = (times[0] - times[times.length - 1]) / 86400000 || 1;
return {
postsPerWeek: +((posts.length / spanDays) * 7).toFixed(1),
longestGapDays: Math.round(Math.max(...gaps)),
};
}
A long recent gap is worth asking about, sometimes it's a break, sometimes it's a creator winding down. Either way you want to know before you book them.
Check 3: how sponsored is their feed already?
An audience already saturated with the creator's sponsored posts is a worse buy, ad fatigue is real. The partnership flags let you measure the load:
function sponsoredLoad(posts) {
const sponsored = posts.filter(
(p) => p.is_paid_partnership || p.is_ad || p.is_affiliate,
).length;
return { sponsored, total: posts.length, ratio: posts.length ? sponsored / posts.length : 0 };
}
There's no universal "too high," but a feed that's more than half disclosed sponsorships means their audience sees a lot of ads, factor that into what you expect. The mechanics of these flags are covered in telling if a post is an ad.
Check 4: a quick audience-quality spot check
You can't fully audit follower authenticity from the outside, but you can run a cheap sanity check: does engagement track with follower count in a believable way? An account with 500,000 followers and 40 likes a post is a red flag. For the deeper method, we wrote up checking for fake followers for free and the audience quality audit workflow.
function sanityCheck(followers, medianEngagement) {
const rate = followers ? (medianEngagement / followers) * 100 : 0;
// Suspiciously low engagement for the follower size is a flag to investigate
return { medianRate: +rate.toFixed(2), flag: followers > 100000 && rate < 0.3 };
}
Check 5: recent reach drop
Compare their most recent posts to their 90-day median. A creator whose last several posts all sit well below their own baseline may be in a reach slump, you'd be buying at a bad time.
function recentTrend(posts) {
const eng = posts
.sort((a, b) => new Date(b.taken_at) - new Date(a.taken_at))
.map((p) => (p.like_count ?? 0) + (p.comment_count ?? 0));
const recent = eng.slice(0, 5);
const rest = eng.slice(5);
const med = (arr) => [...arr].sort((a, b) => a - b)[Math.floor(arr.length / 2)] ?? 0;
return { recentMedian: med(recent), baselineMedian: med(rest) };
}
If recentMedian is a fraction of baselineMedian, ask why before committing.
Rolling it into one verdict
Run all five, print a one-line summary per creator, and you can vet a shortlist of 20 in the time it used to take to read one media kit:
async function vet(handle) {
const [user, posts] = await Promise.all([getProfile(handle), getPosts(handle)]);
const followers = user?.edge_followed_by?.count ?? 0;
const recent = posts.filter(
(p) => Date.now() - new Date(p.taken_at).getTime() < 90 * 86400000,
);
return {
handle,
followers,
...engagementStats(recent, followers),
...cadence(recent),
...sponsoredLoad(recent),
...recentTrend(recent),
};
}
What this can't do
- It's not a full fraud audit. You can flag suspicious engagement, but confirming bought followers needs deeper analysis, and even then it's probabilistic. Treat the sanity check as a prompt, not a verdict.
- Public engagement isn't private reach. You see likes and comments, not the creator's true impressions or story performance. Ask for their native analytics screenshots for the private side.
- Fields vary. Some posts hide like counts; handle missing values instead of scoring them as zero. Log a raw response to confirm shapes.
- Numbers don't judge fit. Whether a creator's content and audience match your brand is a human call. The data gets you to a defensible shortlist, not a signed contract.
Who this is for
- Brand and influencer managers vetting a shortlist before sending contracts.
- Agencies running the same five checks across dozens of creators for a client campaign.
- Creators who want to audit their own last 90 days the way a brand will, before they pitch.
Frequently Asked Questions
What should I check before signing an influencer?
At minimum: median (not average) engagement, posting cadence, how sponsored their feed already is, an audience-quality sanity check, and whether their recent posts are dropping below their own baseline. All five are computable from their public last-90-days history.
Why use median engagement instead of average?
Because one viral post inflates the average and hides a creator's typical performance. The median reflects what a normal post does, which is the better predictor of how your paid post will perform.
Can I tell if a creator has fake followers?
You can spot warning signs, like large follower counts paired with very low engagement, but confirming bought followers takes deeper analysis and is still probabilistic. Use the sanity check to decide who's worth a closer audit.
How far back can I pull a creator's posts?
You can page through their recent posts and filter by timestamp to a 90-day window. Very old history may require more pagination (and more credits), but 90 days is usually plenty to judge current performance.
Does a high sponsored ratio mean I shouldn't book them?
Not necessarily, but a heavily sponsored feed can mean audience ad fatigue, which may dampen your results. Weigh it against their engagement and fit rather than treating it as an automatic no.
How many credits does vetting one creator cost?
Roughly two to a few credits per creator (profile plus one or more pages of posts). New accounts start with 50 free credits, enough to vet a first shortlist at no cost.
Wrapping up
A media kit is marketing; a creator's last 90 days is evidence. Pull their real recent posts, judge them by the median, check the cadence and sponsored load, sanity-check the audience, and watch for a recent slump. Five short functions turn "trust me, my engagement is great" into a number you can defend to whoever signs the check.
Want to vet your creator shortlist with real data? Start free with SociaVault, 50 credits, no card, and run your first check in a couple of minutes.
Related Articles
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.