Overview
Competitors do not operate on a single platform, and neither should your monitoring. This workflow runs daily at 7 AM, searches for your competitors on Google (news and web), Reddit (discussions and mentions), and TikTok (content and engagement), aggregates the signals into a unified intelligence feed, and highlights anything new or trending. Monitoring 3 competitors across 3 platforms costs about 9 credits per day ($0.045).
Trigger
Cron 7 AM UTC daily
Schedule
Daily 7 AM
Workflow Steps
Load Competitor Configuration
Read the list of competitor names, domains, and platform-specific identifiers from config.
Search Google for Competitor News
For each competitor, search Google via Scavio for recent news, press releases, and product updates.
Search Reddit for Mentions
Search Reddit via Scavio for competitor name mentions in relevant subreddits.
Search TikTok for Content
Search TikTok via Scavio for competitor brand mentions and related content.
Aggregate and Deduplicate
Merge results across platforms, deduplicate by URL, and tag each item with its source platform.
Score and Alert
Score items by novelty and relevance. Send a daily digest with the top signals to Slack or email.
Python Implementation
import requests, os, json
from pathlib import Path
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
SH = {"x-api-key": API_KEY, "Content-Type": "application/json"}
TH = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
COMPETITORS = [
{"name": "Competitor A", "domain": "competitora.com", "tiktok": "competitora"},
{"name": "Competitor B", "domain": "competitorb.com", "tiktok": "competitorb"},
{"name": "Competitor C", "domain": "competitorc.com", "tiktok": "competitorc"},
]
INTEL_DIR = Path("competitive_intel")
INTEL_DIR.mkdir(exist_ok=True)
def search_google(query: str) -> list:
resp = requests.post("https://api.scavio.dev/api/v1/search", headers=SH, json={"query": query, "platform": "google"}, timeout=15)
return resp.json().get("organic", []) if resp.ok else []
def search_reddit(query: str) -> list:
resp = requests.post("https://api.scavio.dev/api/v1/search", headers=SH, json={"query": query, "platform": "reddit"}, timeout=15)
return resp.json().get("organic", []) if resp.ok else []
def search_tiktok(query: str) -> list:
resp = requests.post("https://api.scavio.dev/api/v1/tiktok/search", headers=TH, json={"query": query}, timeout=15)
return resp.json().get("results", []) if resp.ok else []
def run():
all_signals = []
seen_urls = set()
for comp in COMPETITORS:
for platform_fn, platform_name, query in [
(search_google, "google", f"{comp['name']} news 2026"),
(search_reddit, "reddit", f"{comp['name']} review discussion"),
(search_tiktok, "tiktok", comp["tiktok"]),
]:
results = platform_fn(query)
for r in results[:5]:
url = r.get("url", "") or r.get("link", "")
if url and url not in seen_urls:
seen_urls.add(url)
all_signals.append({
"competitor": comp["name"],
"platform": platform_name,
"title": r.get("title", "") or r.get("description", ""),
"url": url,
"snippet": r.get("snippet", ""),
})
all_signals.sort(key=lambda s: s["platform"])
out = INTEL_DIR / f"intel_{date.today()}.json"
out.write_text(json.dumps(all_signals, indent=2))
print(f"Competitive intel for {date.today()}: {len(all_signals)} signals")
for s in all_signals[:10]:
print(f" [{s['platform']}] {s['competitor']}: {s['title'][:60]}")
run()JavaScript Implementation
const SH = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const TH = {'Authorization': 'Bearer '+process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const COMPETITORS = [
{name:'Competitor A', domain:'competitora.com', tiktok:'competitora'},
{name:'Competitor B', domain:'competitorb.com', tiktok:'competitorb'},
{name:'Competitor C', domain:'competitorc.com', tiktok:'competitorc'},
];
const INTEL_DIR = 'competitive_intel';
try { fs.mkdirSync(INTEL_DIR); } catch {}
async function searchGoogle(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:SH, body:JSON.stringify({query, platform:'google'})});
return (await r.json()).organic || [];
}
async function searchReddit(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:SH, body:JSON.stringify({query, platform:'reddit'})});
return (await r.json()).organic || [];
}
async function searchTiktok(query) {
const r = await fetch('https://api.scavio.dev/api/v1/tiktok/search', {method:'POST', headers:TH, body:JSON.stringify({query})});
return (await r.json()).results || [];
}
const allSignals = [];
const seenUrls = new Set();
for (const comp of COMPETITORS) {
const searches = [
{fn:searchGoogle, platform:'google', query:comp.name+' news 2026'},
{fn:searchReddit, platform:'reddit', query:comp.name+' review discussion'},
{fn:searchTiktok, platform:'tiktok', query:comp.tiktok},
];
for (const s of searches) {
const results = await s.fn(s.query);
for (const r of results.slice(0,5)) {
const url = r.url || r.link || '';
if (url && !seenUrls.has(url)) {
seenUrls.add(url);
allSignals.push({competitor:comp.name, platform:s.platform, title:r.title||r.description||'', url, snippet:r.snippet||''});
}
}
}
}
const today = new Date().toISOString().split('T')[0];
fs.writeFileSync(INTEL_DIR+'/intel_'+today+'.json', JSON.stringify(allSignals, null, 2));
console.log('Competitive intel: '+allSignals.length+' signals');
allSignals.slice(0,10).forEach(s => console.log(' ['+s.platform+'] '+s.competitor+': '+s.title.slice(0,60)));Platforms Used
Web search with knowledge graph, PAA, and AI overviews
Community, posts & threaded comments from any subreddit
TikTok
Trending video, creator, and product discovery