TikTok Influencer Vetting: Data-Driven Approach
Before paying $5K for an influencer: check follower quality, engagement rate, content consistency, audience overlap. All via TikTok API endpoints.
Before paying $5K+ for a TikTok influencer campaign, you can programmatically verify follower quality, engagement authenticity, content consistency, and audience relevance using TikTok API endpoints. Data-driven vetting catches fake engagement and mismatched audiences that manual scrolling misses, potentially saving thousands on campaigns that would underperform.
The four vetting signals
Signal 1: Follower/following ratio. Legitimate influencers typically have 10:1 or higher (100K followers, under 10K following). Accounts with 1:1 ratios grew through follow-for-follow, which means low engagement audiences. Signal 2: Engagement rate. Calculate (likes + comments) / views across recent videos. Healthy range is 3-8% for mid-tier creators. Below 1% suggests bought followers. Signal 3: Content consistency. Check if recent posts align with your product category. Signal 4: Audience overlap with your target market.
Pulling creator data via API
import requests, os
from statistics import mean
BASE = "https://api.scavio.dev/api/v1/tiktok"
AUTH = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"}
def get_creator_profile(username: str) -> dict:
"""Fetch creator profile data. 1 credit per request."""
resp = requests.post(f"{BASE}/user/info",
headers=AUTH,
json={"username": username},
timeout=10)
return resp.json()
def get_recent_videos(username: str, count: int = 20) -> list[dict]:
"""Fetch recent videos for engagement analysis."""
resp = requests.post(f"{BASE}/user/posts",
headers=AUTH,
json={"username": username, "count": count},
timeout=10)
return resp.json().get("videos", [])The vetting script
def vet_influencer(username: str) -> dict:
profile = get_creator_profile(username)
videos = get_recent_videos(username, count=20)
followers = profile.get("follower_count", 0)
following = profile.get("following_count", 1)
# Signal 1: Follower quality ratio
ff_ratio = followers / max(following, 1)
# Signal 2: Engagement rate across recent videos
engagement_rates = []
for v in videos:
views = v.get("view_count", 1)
likes = v.get("like_count", 0)
comments = v.get("comment_count", 0)
rate = (likes + comments) / max(views, 1) * 100
engagement_rates.append(rate)
avg_engagement = mean(engagement_rates) if engagement_rates else 0
# Signal 3: Content consistency (check for niche keywords)
descriptions = [v.get("description", "") for v in videos]
total_desc = " ".join(descriptions).lower()
# Signal 4: Posting frequency (posts per week)
if len(videos) >= 2:
first_ts = videos[0].get("create_time", 0)
last_ts = videos[-1].get("create_time", 0)
days_span = max((first_ts - last_ts) / 86400, 1)
posts_per_week = len(videos) / days_span * 7
else:
posts_per_week = 0
# Scoring
flags = []
if ff_ratio < 5:
flags.append("low_follower_ratio")
if avg_engagement < 1.5:
flags.append("low_engagement")
if avg_engagement > 20:
flags.append("suspiciously_high_engagement")
if posts_per_week < 1:
flags.append("inconsistent_posting")
return {
"username": username,
"followers": followers,
"ff_ratio": round(ff_ratio, 1),
"avg_engagement_pct": round(avg_engagement, 2),
"posts_per_week": round(posts_per_week, 1),
"flags": flags,
"verdict": "pass" if len(flags) == 0 else "review",
"cost_per_request": "$0.005 (1 credit)"
}Reading the results
A healthy creator profile looks like: ff_ratio above 10, avg_engagement between 3-8%, posts_per_week above 3, zero flags. Any flag means manual review before spending. The "suspiciously_high_engagement" flag catches creators who buy likes on specific videos to inflate their media kit numbers. Compare engagement across all videos, not just the best ones.
Batch vetting for campaign planning
def batch_vet(usernames: list[str], niche_keywords: list[str]) -> list[dict]:
"""Vet multiple creators and rank by quality score."""
results = []
for u in usernames:
report = vet_influencer(u)
# Check niche relevance from video descriptions
videos = get_recent_videos(u, count=10)
descs = " ".join(v.get("description", "") for v in videos).lower()
niche_hits = sum(1 for kw in niche_keywords if kw.lower() in descs)
report["niche_relevance"] = niche_hits / max(len(niche_keywords), 1)
results.append(report)
# Sort: fewest flags first, then highest engagement
return sorted(results, key=lambda x: (len(x["flags"]), -x["avg_engagement_pct"]))Cost of vetting vs cost of failure
Vetting 20 potential influencers uses about 60 API requests (profile + videos + comments for each): 60 credits = $0.30. Compare to spending $5,000 on an influencer with bought followers who delivers 200 views on your sponsored post. The vetting cost is negligible relative to campaign budgets. Run vetting before every campaign, not just the first one, because creator quality changes over time.