TikTok Creator Vetting via API Before Paying $5K+
Vet TikTok influencers for $0.15/creator via API: engagement, bot detection, sentiment, audience overlap.
A full TikTok creator vet -- profile, recent posts, follower sample, comment sentiment -- costs about $0.025 via API and takes under 2 seconds. Brands spending $5K-50K on influencer campaigns without this check are gambling on vibes.
The Vetting Checklist
Five signals separate a worthwhile creator from a waste of budget: (1) follower-to-engagement ratio reveals bought followers, (2) recent post consistency shows active vs dormant accounts, (3) follower sample quality flags bot networks, (4) comment sentiment distinguishes real engagement from spam, (5) audience overlap with other campaign creators avoids paying twice for the same eyeballs.
Setup
import requests, os
from collections import Counter
API_KEY = os.environ["SCAVIO_API_KEY"]
BASE = "https://api.scavio.dev/api/v1/tiktok"
HEADERS = {"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"}
def tiktok_api(endpoint, payload):
resp = requests.post(f"{BASE}/{endpoint}",
headers=HEADERS, json=payload)
return resp.json()["data"]Step 1: Profile Data
def get_profile(username):
data = tiktok_api("profile", {"username": username})
user = data["user"]
return {
"username": username,
"followers": user["follower_count"],
"following": user["following_count"],
"videos": user["aweme_count"],
"total_likes": user["total_favorited"],
"sec_uid": user["sec_uid"],
"verified": user.get("verification_type", 0) > 0,
"bio_link": bool(user.get("bio_url", "")),
}
# 1 creditStep 2: Engagement Rate From Recent Posts
def analyze_posts(sec_uid, count=15):
data = tiktok_api("user/posts",
{"sec_user_id": sec_uid, "count": count, "sort_type": "0"})
posts = data["aweme_list"]
stats = []
for p in posts:
s = p["statistics"]
stats.append({
"views": s["play_count"],
"likes": s["digg_count"],
"comments": s["comment_count"],
"shares": s["share_count"],
})
total_eng = sum(s["likes"] + s["comments"] + s["shares"] for s in stats)
avg_views = sum(s["views"] for s in stats) / len(stats) if stats else 0
return {
"post_count": len(stats),
"avg_views": int(avg_views),
"avg_engagement": int(total_eng / len(stats)) if stats else 0,
"view_variance": max(s["views"] for s in stats) / (avg_views or 1),
}
# 1 creditStep 3: Follower Quality Sample
def check_followers(sec_uid, sample=50):
data = tiktok_api("user/followers",
{"sec_user_id": sec_uid, "count": sample})
followers = data.get("followers", [])
red_flags = 0
for f in followers:
# Bot signals: no avatar, no videos, suspicious username patterns
has_no_videos = f.get("aweme_count", 0) == 0
has_no_avatar = "default" in f.get("avatar_thumb", {}).get("url_list", [""])[0]
if has_no_videos and has_no_avatar:
red_flags += 1
return {
"sampled": len(followers),
"suspicious": red_flags,
"bot_rate": round(red_flags / len(followers) * 100, 1) if followers else 0,
}
# 1 creditStep 4: Comment Sentiment
def check_comments(video_id, count=30):
data = tiktok_api("video/comments",
{"video_id": video_id, "count": count})
comments = data.get("comments", [])
# Simple heuristic: short generic comments are often bot-generated
generic_phrases = {"nice", "cool", "wow", "amazing", "love it",
"fire", "follow me", "check my page"}
generic_count = sum(1 for c in comments
if c.get("text", "").lower().strip() in generic_phrases)
return {
"total_comments": len(comments),
"generic_spam": generic_count,
"spam_rate": round(generic_count / len(comments) * 100, 1) if comments else 0,
}
# 1 creditFull Vetting Pipeline
def vet_creator(username):
profile = get_profile(username) # 1 credit
posts = analyze_posts(profile["sec_uid"]) # 1 credit
followers = check_followers(profile["sec_uid"]) # 1 credit
# Get first video ID for comment check
post_data = tiktok_api("user/posts",
{"sec_user_id": profile["sec_uid"], "count": 1, "sort_type": "0"})
video_id = post_data["aweme_list"][0]["aweme_id"]
comments = check_comments(video_id) # 1 credit
engagement_rate = (posts["avg_engagement"] /
profile["followers"] * 100) if profile["followers"] else 0
flags = []
if engagement_rate < 1.0: flags.append("low engagement")
if followers["bot_rate"] > 30: flags.append("high bot rate")
if comments["spam_rate"] > 50: flags.append("spammy comments")
verdict = "REVIEW" if flags else "PASS"
return {"username": username, "followers": profile["followers"],
"engagement_rate": round(engagement_rate, 2),
"bot_rate": followers["bot_rate"],
"spam_rate": comments["spam_rate"],
"verdict": verdict, "flags": flags}
# Total: 5 credits = $0.025 per creator
# Vetting 200 creators for a campaign: $5.00
result = vet_creator("target_creator")
print(f"@{result['username']}: {result['verdict']}")
for flag in result["flags"]:
print(f" - {flag}")Cost vs Alternatives
Vetting 200 creators with Scavio: $5. Manual VA research at $20/hour (10 creators/hour): $400. HypeAuditor or Modash subscription: $199-399/month. The API approach is 80-100x cheaper than manual and gives you raw data you can score however you want, not a black-box "authenticity score."