brandmonitoringcross-platform

Cross-Platform Brand Monitor 2026

Monitor brand mentions across Google, Reddit, TikTok, and YouTube from a single API. Daily digest pipeline with sentiment scoring and alert thresholds.

8 min

You can monitor brand mentions across Google, Reddit, and TikTok using one API and one credit pool. A daily pipeline searches each platform for your brand name, aggregates mention counts, scores sentiment, and alerts on spikes. Total cost is roughly $0.015 per brand per day (3 platforms x $0.005/query).

The Pipeline Architecture

  1. Search Google SERP for brand mentions and news coverage
  2. Search Reddit via SERP for community discussions
  3. Search TikTok for video mentions and hashtag usage
  4. Aggregate results, compute sentiment scores, store history
  5. Compare today vs 7-day average, alert on 2x+ spikes

Google and Reddit Search Layer

Python
import requests, os
from datetime import datetime

API_KEY = os.environ["SCAVIO_API_KEY"]
SEARCH_URL = "https://api.scavio.dev/api/v1/search"
TIKTOK_URL = "https://api.scavio.dev/api/v1/tiktok"

def search_google(brand: str) -> dict:
    resp = requests.post(SEARCH_URL,
        headers={"x-api-key": API_KEY},
        json={"query": f'"{brand}"', "num_results": 20},
        timeout=15)
    results = resp.json().get("results", [])
    return {
        "platform": "google",
        "mention_count": len(results),
        "results": [{"title": r["title"], "url": r["url"],
                      "snippet": r.get("snippet", "")} for r in results],
    }

def search_reddit(brand: str) -> dict:
    resp = requests.post(SEARCH_URL,
        headers={"x-api-key": API_KEY},
        json={"query": f'"{brand}" site:reddit.com', "num_results": 20},
        timeout=15)
    results = resp.json().get("results", [])
    return {
        "platform": "reddit",
        "mention_count": len(results),
        "results": [{"title": r["title"], "url": r["url"],
                      "snippet": r.get("snippet", "")} for r in results],
    }

TikTok Search Layer

Python
def search_tiktok(brand: str) -> dict:
    resp = requests.post(f"{TIKTOK_URL}/search/videos",
        headers={"Authorization": f"Bearer {API_KEY}",
                 "Content-Type": "application/json"},
        json={"keyword": brand, "count": 20,
              "publish_time": "7", "sort_type": "1"},
        timeout=15)
    data = resp.json().get("data", {})
    videos = data.get("aweme_list", [])
    total_views = sum(v.get("statistics", {}).get("play_count", 0) for v in videos)
    return {
        "platform": "tiktok",
        "mention_count": len(videos),
        "total_views": total_views,
        "results": [{"desc": v["desc"][:100],
                      "views": v["statistics"]["play_count"],
                      "likes": v["statistics"]["digg_count"]}
                     for v in videos[:10]],
    }

Sentiment Scoring

Python
POSITIVE = {"love", "great", "best", "amazing", "recommend", "excellent", "happy"}
NEGATIVE = {"hate", "terrible", "worst", "scam", "broken", "avoid", "awful"}

def score_sentiment(results: list[dict]) -> dict:
    pos, neg, neutral = 0, 0, 0
    for r in results:
        text = (r.get("title", "") + " " + r.get("snippet", "") +
                " " + r.get("desc", "")).lower()
        words = set(text.split())
        if words & POSITIVE:
            pos += 1
        elif words & NEGATIVE:
            neg += 1
        else:
            neutral += 1
    total = max(pos + neg + neutral, 1)
    return {
        "positive": pos, "negative": neg, "neutral": neutral,
        "score": round((pos - neg) / total, 3),
    }

Spike Detection and Alerting

Python
import json

def run_monitor(brands: list[str], history_file: str = "brand_history.json"):
    try:
        with open(history_file) as f:
            history = json.load(f)
    except FileNotFoundError:
        history = {}

    today = datetime.now().strftime("%Y-%m-%d")
    alerts = []

    for brand in brands:
        google = search_google(brand)
        reddit = search_reddit(brand)
        tiktok = search_tiktok(brand)
        all_results = google["results"] + reddit["results"] + tiktok.get("results", [])
        sentiment = score_sentiment(all_results)
        total_mentions = google["mention_count"] + reddit["mention_count"] + tiktok["mention_count"]

        # Store today
        history.setdefault(brand, []).append({
            "date": today, "mentions": total_mentions,
            "sentiment": sentiment["score"],
            "by_platform": {
                "google": google["mention_count"],
                "reddit": reddit["mention_count"],
                "tiktok": tiktok["mention_count"],
            },
        })

        # Check for spike vs 7-day average
        recent = history[brand][-7:]
        avg = sum(d["mentions"] for d in recent) / max(len(recent), 1)
        if avg > 0 and total_mentions >= avg * 2:
            alerts.append(f"{brand}: {total_mentions} mentions today vs {avg:.0f} avg (spike)")

    with open(history_file, "w") as f:
        json.dump(history, f, indent=2)
    return alerts

alerts = run_monitor(["acme corp", "acme saas"])
for a in alerts:
    print(a)

Cost Breakdown

  • 3 API calls per brand per day (Google + Reddit + TikTok)
  • $0.005/call = $0.015/brand/day
  • 5 brands monitored daily: $0.075/day = $2.25/mo
  • 20 brands: $0.30/day = $9/mo
  • All fits within the $30/mo plan (7,000 credits). 20 brands x 3 calls x 30 days = 1,800 credits/mo.

What This Misses

Keyword-based sentiment is crude. It catches obvious positive and negative mentions but misses sarcasm, context-dependent sentiment, and neutral mentions that matter (like someone asking "has anyone used {brand}?"). For more accurate sentiment, pipe the aggregated mentions through an LLM for classification. That adds ~$0.01/mention in LLM cost but dramatically improves accuracy. The keyword approach works as a first pass to detect volume changes; the LLM pass is for understanding what people are actually saying.