tiktokugcbrand-monitoring

TikTok UGC Tracking: API vs Manual Monitoring

Track user-generated TikTok content about your brand via API instead of manual searching. Hashtag monitoring, comment scanning, and campaign UGC collection.

6 min read

Tracking user-generated content about your brand on TikTok via API costs under $5/month and catches mentions that manual browsing misses. The Scavio TikTok video search endpoint returns structured results for any keyword at 1 credit ($0.005) per request.

The Manual Approach Problem

Most brands track UGC by searching TikTok manually, scrolling through results, and screenshotting relevant videos. This misses content that uses different spellings, abbreviations, or hashtag variations. A social media manager checking TikTok twice daily catches maybe 30% of brand mentions. The rest decay in algorithmic obscurity before anyone on the team sees them.

API-Based UGC Monitoring

Python
import requests, os, json
from datetime import date

API_KEY = os.environ["SCAVIO_API_KEY"]
BASE = "https://api.scavio.dev"
HEADERS = {"Authorization": f"Bearer {API_KEY}",
           "Content-Type": "application/json"}

def find_ugc(brand_terms, pages=3):
    all_mentions = []
    for term in brand_terms:
        cursor = "0"
        for _ in range(pages):
            resp = requests.post(f"{BASE}/api/v1/tiktok/search/videos",
                headers=HEADERS,
                json={"keyword": term, "count": 30,
                      "publish_time": "1", "sort_type": "0"})
            data = resp.json()["data"]
            for v in data.get("aweme_list", []):
                all_mentions.append({
                    "term": term,
                    "video_id": v["aweme_id"],
                    "desc": v["desc"][:120],
                    "author": v["author"]["unique_id"],
                    "views": v["statistics"]["play_count"],
                    "likes": v["statistics"]["digg_count"],
                })
            if not data.get("has_more"):
                break
            cursor = str(data["cursor"])
    # Deduplicate by video_id
    seen = set()
    unique = []
    for m in all_mentions:
        if m["video_id"] not in seen:
            seen.add(m["video_id"])
            unique.append(m)
    return sorted(unique, key=lambda x: x["views"], reverse=True)

brand_terms = ["yourbrand", "your brand", "#yourbrand", "yourbrandreview"]
mentions = find_ugc(brand_terms)
print(f"Found {len(mentions)} unique UGC videos today")

Categorizing UGC by Sentiment

Python
def categorize_ugc(mentions):
    positive_signals = {"love", "best", "amazing", "obsessed", "recommend"}
    negative_signals = {"worst", "hate", "scam", "disappointed", "returned"}
    categories = {"positive": [], "negative": [], "neutral": []}

    for m in mentions:
        words = set(m["desc"].lower().split())
        if words & positive_signals:
            categories["positive"].append(m)
        elif words & negative_signals:
            categories["negative"].append(m)
        else:
            categories["neutral"].append(m)
    return categories

cats = categorize_ugc(mentions)
for sentiment, items in cats.items():
    total_views = sum(i["views"] for i in items)
    print(f"{sentiment}: {len(items)} videos, {total_views:,} total views")

Daily Report Pipeline

Python
def daily_ugc_report(brand_terms, output_dir="ugc_reports"):
    os.makedirs(output_dir, exist_ok=True)
    mentions = find_ugc(brand_terms)
    categories = categorize_ugc(mentions)

    report = {
        "date": str(date.today()),
        "total_mentions": len(mentions),
        "total_views": sum(m["views"] for m in mentions),
        "positive": len(categories["positive"]),
        "negative": len(categories["negative"]),
        "neutral": len(categories["neutral"]),
        "top_mentions": mentions[:20],
    }

    filepath = f"{output_dir}/ugc_{date.today()}.json"
    with open(filepath, "w") as f:
        json.dump(report, f, indent=2)
    return report

Cost Comparison

Monitoring 4 brand term variations daily at 3 pages each costs 12 credits ($0.06) per day, or about $1.80/month. Brandwatch and Sprout Social charge $1,000-5,000/month for social listening that includes TikTok. The tradeoff: API-based monitoring gives you raw data but no dashboard. You build the reporting layer yourself or pipe it into existing tools.

Limitations

Video search finds content where the keyword appears in the caption or hashtags. It does not transcribe audio or read on-screen text. A video that mentions your brand verbally but not in the caption will not appear. For audio-based detection, you would need to combine video search with a speech-to-text pipeline on the video URLs returned.