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.
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
- Search Google SERP for brand mentions and news coverage
- Search Reddit via SERP for community discussions
- Search TikTok for video mentions and hashtag usage
- Aggregate results, compute sentiment scores, store history
- Compare today vs 7-day average, alert on 2x+ spikes
Google and Reddit Search Layer
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
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
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
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.