tiktokinfluencervetting
TikTok Influencer Vetting: Multi-Signal Approach
Single-signal vetting (follower count) wastes brand deals. Multi-signal checks engagement, consistency, niche relevance, follower quality. Score creators 0-100.
8 min
Single-signal influencer vetting (follower count only) leads to wasted brand deals. Multi-signal vetting checks follower authenticity, engagement patterns, content consistency, audience overlap with existing partners, and comment sentiment. API-based analysis covers all signals in seconds per creator, replacing hours of manual review.
The five vetting signals
- Engagement rate: likes + comments + shares / views (healthy: 2-8%)
- Engagement consistency: standard deviation across recent posts
- Content relevance: do recent posts match your brand niche?
- Follower quality: following-to-follower ratio and growth patterns
- Comment sentiment: real comments vs generic bot responses
Multi-signal vetting pipeline
Python
import requests
def vet_influencer(username: str, brand_niche: str) -> dict:
"""Multi-signal influencer vetting."""
# Signal 1 & 4: Profile metrics
profile_resp = requests.post(
"https://api.scavio.dev/api/v1/tiktok/user/info",
headers={"Authorization": "Bearer YOUR_KEY"},
json={"username": username}
)
profile = profile_resp.json().get("data", {}).get("user", {})
stats = profile.get("stats", {})
followers = stats.get("followerCount", 0)
following = stats.get("followingCount", 0)
# Signal 2 & 3: Post engagement and content
posts_resp = requests.post(
"https://api.scavio.dev/api/v1/tiktok/user/posts",
headers={"Authorization": "Bearer YOUR_KEY"},
json={"username": username, "count": 20}
)
posts = posts_resp.json().get("data", {}).get("videos", [])
engagement_rates = []
niche_match_count = 0
for post in posts:
s = post.get("stats", {})
views = s.get("playCount", 0)
if views > 0:
eng = (s.get("diggCount", 0) + s.get("commentCount", 0) +
s.get("shareCount", 0)) / views * 100
engagement_rates.append(eng)
desc = post.get("desc", "").lower()
if brand_niche.lower() in desc:
niche_match_count += 1
avg_eng = sum(engagement_rates) / len(engagement_rates) if engagement_rates else 0
eng_std = (
sum((x - avg_eng) ** 2 for x in engagement_rates) / len(engagement_rates)
) ** 0.5 if len(engagement_rates) > 1 else 0
# Score (0-100)
score = 0
score += min(30, avg_eng * 5) # Engagement rate (max 30)
score += min(20, 20 - eng_std * 2) # Consistency (max 20)
score += min(20, niche_match_count * 4) # Niche relevance (max 20)
score += min(15, 15 if following < followers * 0.3 else 5) # Follower quality
score += min(15, 15 if followers > 5000 else followers / 5000 * 15) # Reach
return {
"username": username,
"followers": followers,
"avg_engagement": round(avg_eng, 2),
"engagement_consistency": round(eng_std, 2),
"niche_relevance": f"{niche_match_count}/{len(posts)} posts",
"score": round(score),
"recommendation": "PROCEED" if score >= 60 else "CAUTION" if score >= 40 else "SKIP"
}
result = vet_influencer("creator_handle", "skincare")
print(f"Score: {result['score']}/100 - {result['recommendation']}")
Compare multiple creators
JavaScript
// Rank creators by multi-signal score
async function rankCreators(usernames, niche) {
const scored = [];
for (const username of usernames) {
const profileResp = await fetch(
"https://api.scavio.dev/api/v1/tiktok/user/info",
{
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.SCAVIO_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({ username })
}
);
const profile = await profileResp.json();
const stats = profile.data?.user?.stats || {};
const postsResp = await fetch(
"https://api.scavio.dev/api/v1/tiktok/user/posts",
{
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.SCAVIO_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({ username, count: 10 })
}
);
const postsData = await postsResp.json();
const posts = postsData.data?.videos || [];
const avgViews = posts.reduce(
(sum, p) => sum + (p.stats?.playCount || 0), 0
) / (posts.length || 1);
scored.push({
username,
followers: stats.followerCount || 0,
avgViews: Math.round(avgViews),
estimatedCPV: avgViews > 0
? (500 / avgViews * 1000).toFixed(2) // Assuming $500 deal
: "N/A"
});
}
return scored.sort((a, b) => b.avgViews - a.avgViews);
}
Cost per vetting
Profile + posts = 2 API calls = $0.01 per creator. Vetting 50 creators for a campaign: $0.50. Compare to influencer platforms (Upfluence, Grin) at $500-2,000/month with less granular data.