Les équipes de marketing d’influence passent 15 à 30 minutes à vérifier manuellement chaque créateur TikTok en parcourant les profils, en observant l’engagement et en devinant l’authenticité des abonnés. Cela ne passe pas à l’échelle lorsqu’il faut évaluer 200 créateurs pour une campagne. L’API Scavio TikTok vous permet d’automatiser tout le processus de vérification : récupérer les données du profil (nombre d’abonnés, statut de vérification), obtenir les publications récentes (taux d’engagement, fréquence de publication) et signaler les drapeaux rouges comme les ratios abonnés/engagement suspects. La vérification d’un créateur nécessite environ 4 appels API (profil + 3 pages de publications), pour un coût total de 0,02 $. Une campagne de vérification de 200 créateurs coûte 4 $.
Prérequis
- Python 3.8+ ou Node.js 18+
- Une clé API Scavio depuis scavio.dev
- Bibliothèque requests installée (Python)
- Une liste de noms d’utilisateur TikTok à vérifier
Parcours
Étape 1: Récupérer les données de profil du créateur
Récupérer le profil du créateur, y compris le nombre d’abonnés, le nombre de vidéos, le total de likes et le statut de vérification. Le point de terminaison du profil renvoie également le sec_uid nécessaire pour récupérer les publications.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
HEADERS = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
def get_profile(username):
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/profile',
headers=HEADERS, json={'username': username})
user = resp.json()['data']['user']
return {
'username': user['unique_id'],
'followers': user['follower_count'],
'following': user['following_count'],
'videos': user['aweme_count'],
'likes': user['total_favorited'],
'verified': user.get('verified', False),
'sec_uid': user['sec_uid'],
}Étape 2: Récupérer les publications récentes et calculer le taux d’engagement
Récupérer les 60 dernières publications et calculer le taux d’engagement moyen (likes + commentaires + partages divisé par le nombre de lectures). Un taux d’engagement sain sur TikTok se situe généralement entre 3 et 8 %.
def get_engagement_stats(sec_uid, pages=3):
videos = []
params = {'sec_user_id': sec_uid, 'count': 20}
for _ in range(pages):
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/user/posts',
headers=HEADERS, json=params).json()['data']
videos.extend(resp.get('videos', []))
if not resp.get('has_more'): break
params['max_cursor'] = resp['max_cursor']
if not videos:
return {'avg_engagement': 0, 'post_count': 0, 'avg_plays': 0}
rates = []
for v in videos:
s = v['stats']
plays = s.get('playCount', 0)
if plays > 0:
eng = (s.get('diggCount', 0) + s.get('commentCount', 0) + s.get('shareCount', 0)) / plays
rates.append(eng)
return {
'avg_engagement': sum(rates) / len(rates) if rates else 0,
'post_count': len(videos),
'avg_plays': sum(v['stats'].get('playCount', 0) for v in videos) / len(videos),
}Étape 3: Noter et signaler les drapeaux rouges
Combiner les données du profil et d’engagement en un score de vérification. Signaler les drapeaux rouges : engagement très faible avec un grand nombre d’abonnés (probablement achetés), aucune publication depuis 30 jours, anomalies dans le ratio abonnés/abonnements.
def vet_creator(username):
profile = get_profile(username)
engagement = get_engagement_stats(profile['sec_uid'])
flags = []
if profile['followers'] > 50000 and engagement['avg_engagement'] < 0.01:
flags.append('LOW_ENGAGEMENT: possible bought followers')
if profile['followers'] > 0 and profile['following'] / profile['followers'] > 2:
flags.append('HIGH_FOLLOW_RATIO: follows many more than followers')
if engagement['post_count'] == 0:
flags.append('INACTIVE: no recent posts found')
score = 'PASS' if not flags else 'REVIEW'
return {
'username': profile['username'],
'followers': profile['followers'],
'verified': profile['verified'],
'avg_engagement': f"{engagement['avg_engagement']:.2%}",
'avg_plays': int(engagement['avg_plays']),
'recent_posts': engagement['post_count'],
'flags': flags,
'verdict': score,
}Étape 4: Vérifier par lot une liste de créateurs
Exécuter le pipeline de vérification sur tous les créateurs candidats et produire un rapport récapitulatif.
def batch_vet(usernames):
results = []
for username in usernames:
result = vet_creator(username)
results.append(result)
status = result['verdict']
print(f"[{status}] @{result['username']}: {result['followers']:,} followers, "
f"{result['avg_engagement']} engagement")
for flag in result['flags']:
print(f" WARNING: {flag}")
passed = [r for r in results if r['verdict'] == 'PASS']
print(f"\n{len(passed)}/{len(results)} creators passed vetting")
return results
batch_vet(['creator1', 'creator2', 'creator3'])Exemple Python
import requests, os, json
API_KEY = os.environ['SCAVIO_API_KEY']
HEADERS = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
def get_profile(username):
u = requests.post('https://api.scavio.dev/api/v1/tiktok/profile',
headers=HEADERS, json={'username': username}).json()['data']['user']
return {'username': u['unique_id'], 'followers': u['follower_count'],
'following': u['following_count'], 'likes': u['total_favorited'],
'verified': u.get('verified', False), 'sec_uid': u['sec_uid']}
def get_engagement(sec_uid):
videos, params = [], {'sec_user_id': sec_uid, 'count': 20}
for _ in range(3):
r = requests.post('https://api.scavio.dev/api/v1/tiktok/user/posts',
headers=HEADERS, json=params).json()['data']
videos.extend(r.get('videos', []))
if not r.get('has_more'): break
params['max_cursor'] = r['max_cursor']
rates = []
for v in videos:
s = v['stats']
if s.get('playCount', 0) > 0:
rates.append((s['diggCount'] + s['commentCount'] + s['shareCount']) / s['playCount'])
return sum(rates) / len(rates) if rates else 0, len(videos)
def vet(username):
p = get_profile(username)
eng, posts = get_engagement(p['sec_uid'])
flags = []
if p['followers'] > 50000 and eng < 0.01: flags.append('LOW_ENGAGEMENT')
if posts == 0: flags.append('INACTIVE')
print(f"@{p['username']}: {p['followers']:,} followers, {eng:.2%} engagement, {len(flags)} flags")
return {'profile': p, 'engagement': eng, 'posts': posts, 'flags': flags}
for u in ['creator1', 'creator2']:
vet(u)Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const H = { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json' };
async function getProfile(username) {
const r = await fetch('https://api.scavio.dev/api/v1/tiktok/profile', {
method: 'POST', headers: H, body: JSON.stringify({ username })
}).then(r => r.json());
const u = r.data.user;
return { username: u.unique_id, followers: u.follower_count,
following: u.following_count, sec_uid: u.sec_uid };
}
async function getEngagement(secUid) {
const videos = [];
let params = { sec_user_id: secUid, count: 20 };
for (let i = 0; i < 3; i++) {
const r = await fetch('https://api.scavio.dev/api/v1/tiktok/user/posts', {
method: 'POST', headers: H, body: JSON.stringify(params)
}).then(r => r.json());
videos.push(...(r.data.videos || []));
if (!r.data.has_more) break;
params.max_cursor = r.data.max_cursor;
}
const rates = videos.map(v => {
const s = v.stats;
return s.playCount > 0 ? (s.diggCount + s.commentCount + s.shareCount) / s.playCount : 0;
}).filter(r => r > 0);
return rates.length ? rates.reduce((a, b) => a + b, 0) / rates.length : 0;
}
async function vet(username) {
const p = await getProfile(username);
const eng = await getEngagement(p.sec_uid);
const flags = [];
if (p.followers > 50000 && eng < 0.01) flags.push('LOW_ENGAGEMENT');
console.log(`@${p.username}: ${p.followers} followers, ${(eng * 100).toFixed(2)}% engagement`);
return { profile: p, engagement: eng, flags };
}
(async () => { for (const u of ['creator1', 'creator2']) await vet(u); })();Sortie attendue
[PASS] @fitnessguru: 85,000 followers, 5.40% engagement
[REVIEW] @megafollower: 500,000 followers, 0.80% engagement
WARNING: LOW_ENGAGEMENT: possible bought followers
[PASS] @cookingwithanna: 42,000 followers, 7.20% engagement
2/3 creators passed vetting