Before partnering with a TikTok creator, brands need to verify content safety, audience quality, and controversy history. This tutorial builds an automated brand safety report that screens creators by analyzing their recent content, engagement patterns, and public sentiment. Each creator report costs $0.010.
Prerequisites
- Python 3.8+
- requests library
- A Scavio API key from scavio.dev
- TikTok creator usernames to screen
Walkthrough
Step 1: Fetch creator content for analysis
Pull recent videos from a TikTok creator to analyze content themes.
import os, requests, json
from datetime import datetime
from collections import Counter
API_KEY = os.environ['SCAVIO_API_KEY']
TH = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def get_creator_content(username):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/user/videos',
headers=TH, json={'username': username}).json()
videos = data.get('videos', data.get('data', {}).get('videos', []))
return [{
'desc': v.get('desc', ''),
'plays': v.get('stats', {}).get('playCount', 0),
'likes': v.get('stats', {}).get('diggCount', 0),
'comments': v.get('stats', {}).get('commentCount', 0),
'shares': v.get('stats', {}).get('shareCount', 0),
'hashtags': [h.get('name', '') for h in v.get('textExtra', []) if h.get('hashtagName')],
} for v in videos]
CREATORS = ['charlidamelio', 'khaby.lame', 'addisonre']
creator_data = {}
for username in CREATORS:
videos = get_creator_content(username)
creator_data[username] = videos
total_plays = sum(v['plays'] for v in videos)
print(f' @{username:20} | {len(videos)} videos | {total_plays:,} total plays')
print(f'\nCost: ${len(CREATORS) * 0.005:.3f}')Step 2: Screen content for brand safety issues
Analyze video descriptions for unsafe content themes and calculate safety scores.
UNSAFE_KEYWORDS = {
'high_risk': ['gambling', 'drugs', 'violence', 'explicit', 'nsfw', 'controversy', 'scandal'],
'medium_risk': ['alcohol', 'smoking', 'political', 'conspiracy', 'drama', 'exposed', 'canceled'],
'low_risk': ['rant', 'clickbait', 'shocking', 'unbelievable', 'prank'],
}
def safety_screen(username, videos):
flags = {'high_risk': 0, 'medium_risk': 0, 'low_risk': 0}
flagged_videos = []
for v in videos:
text = v['desc'].lower()
for level, keywords in UNSAFE_KEYWORDS.items():
for kw in keywords:
if kw in text:
flags[level] += 1
flagged_videos.append({'desc': v['desc'][:60], 'level': level, 'keyword': kw})
# Calculate safety score (100 = safest)
total = len(videos) or 1
penalty = flags['high_risk'] * 20 + flags['medium_risk'] * 10 + flags['low_risk'] * 3
safety_score = max(0, 100 - penalty)
# Engagement quality check
if videos:
avg_engagement = sum(v['likes'] + v['comments'] for v in videos) / len(videos)
avg_plays = sum(v['plays'] for v in videos) / len(videos)
engagement_rate = avg_engagement / avg_plays if avg_plays else 0
else:
engagement_rate = 0
return {
'username': username,
'safety_score': safety_score,
'flags': flags,
'flagged_videos': flagged_videos[:5],
'engagement_rate': engagement_rate,
'video_count': len(videos),
}
print(f'\n=== Brand Safety Screening ===')
reports = []
for username, videos in creator_data.items():
report = safety_screen(username, videos)
reports.append(report)
status = 'SAFE' if report['safety_score'] >= 80 else 'REVIEW' if report['safety_score'] >= 50 else 'RISK'
print(f' @{username:20} | Score: {report["safety_score"]:3}/100 | Status: {status}')
if report['flagged_videos']:
for fv in report['flagged_videos'][:2]:
print(f' [{fv["level"]}] "{fv["keyword"]}" in: {fv["desc"]}')Step 3: Check public sentiment via search
Search for controversy or negative press about the creator.
def check_public_sentiment(username):
# Search for controversy
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': f'{username} tiktok controversy', 'country_code': 'us'}, timeout=10).json()
organic = data.get('organic_results', [])
negative_signals = []
for r in organic[:5]:
text = f'{r.get("title", "")} {r.get("snippet", "")}'.lower()
if any(w in text for w in ['controversy', 'scandal', 'canceled', 'backlash', 'apologize', 'fired']):
negative_signals.append(r.get('title', '')[:60])
return {'controversy_results': len(organic), 'negative_signals': negative_signals}
def full_safety_report(reports):
print(f'\n{"=" * 60}')
print(f' TIKTOK CREATOR BRAND SAFETY REPORT')
print(f' Date: {datetime.now().strftime("%Y-%m-%d")}')
print(f'{"=" * 60}')
for report in reports:
sentiment = check_public_sentiment(report['username'])
score = report['safety_score']
if sentiment['negative_signals']:
score = max(0, score - len(sentiment['negative_signals']) * 15)
status = 'APPROVED' if score >= 80 else 'NEEDS REVIEW' if score >= 50 else 'DO NOT PARTNER'
print(f'\n @{report["username"]}')
print(f' Safety Score: {score}/100 | Status: {status}')
print(f' Engagement Rate: {report["engagement_rate"]*100:.1f}%')
print(f' Content Flags: H:{report["flags"]["high_risk"]} M:{report["flags"]["medium_risk"]} L:{report["flags"]["low_risk"]}')
if sentiment['negative_signals']:
print(f' Controversy Signals:')
for s in sentiment['negative_signals'][:2]:
print(f' - {s}')
print(f'\n Cost: ${len(reports) * 0.010:.3f} per report')
print(f' vs. Brand safety tools: $500-2000/mo')
full_safety_report(reports)Python Example
import os, requests
TH = {'Authorization': f'Bearer {os.environ["SCAVIO_API_KEY"]}', 'Content-Type': 'application/json'}
def screen_creator(username):
data = requests.post('https://api.scavio.dev/api/v1/tiktok/user/videos',
headers=TH, json={'username': username}).json()
videos = data.get('videos', data.get('data', {}).get('videos', []))
plays = sum(v.get('stats', {}).get('playCount', 0) for v in videos)
print(f'@{username}: {len(videos)} videos, {plays:,} plays')
screen_creator('charlidamelio')
print('Cost: $0.005')JavaScript Example
const TH = { 'Authorization': `Bearer ${process.env.SCAVIO_API_KEY}`, 'Content-Type': 'application/json' };
const data = await fetch('https://api.scavio.dev/api/v1/tiktok/user/videos', {
method: 'POST', headers: TH, body: JSON.stringify({ username: 'charlidamelio' })
}).then(r => r.json());
const videos = data.videos || data.data?.videos || [];
console.log(`Videos: ${videos.length}`);Expected Output
@charlidamelio | 15 videos | 45,000,000 total plays
@khaby.lame | 12 videos | 120,000,000 total plays
@addisonre | 10 videos | 25,000,000 total plays
=== Brand Safety Screening ===
@charlidamelio | Score: 90/100 | Status: SAFE
@khaby.lame | Score: 100/100 | Status: SAFE
@addisonre | Score: 85/100 | Status: SAFE
============================================================
TIKTOK CREATOR BRAND SAFETY REPORT
Date: 2026-05-21
============================================================
@charlidamelio
Safety Score: 85/100 | Status: APPROVED
Engagement Rate: 8.5%
Cost: $0.030 per report
vs. Brand safety tools: $500-2000/mo