Aperçu
Les concurrents n'opèrent pas sur une seule plateforme, et votre surveillance ne devrait pas non plus. Ce workflow s'exécute quotidiennement à 7h, recherche vos concurrents sur Google (actualités et web), Reddit (discussions et mentions) et TikTok (contenu et engagement), agrège les signaux en un flux d'intelligence unifié et met en évidence tout ce qui est nouveau ou tendance. Surveiller 3 concurrents sur 3 plateformes coûte environ 9 crédits par jour (0,045 $).
Déclencheur
Cron quotidien à 7h UTC
Planification
Tous les jours à 7h
Étapes du workflow
Charger la configuration des concurrents
Lire la liste des noms de concurrents, domaines et identifiants spécifiques aux plateformes depuis la configuration.
Rechercher les actualités des concurrents sur Google
Pour chaque concurrent, rechercher sur Google via Scavio les actualités récentes, communiqués de presse et mises à jour produits.
Rechercher les mentions sur Reddit
Rechercher sur Reddit via Scavio les mentions du nom du concurrent dans les subreddits pertinents.
Rechercher du contenu sur TikTok
Rechercher sur TikTok via Scavio les mentions de la marque concurrente et le contenu associé.
Agréger et dédoublonner
Fusionner les résultats entre les plateformes, dédoublonner par URL et étiqueter chaque élément avec sa plateforme source.
Noter et alerter
Noter les éléments selon leur nouveauté et pertinence. Envoyer un résumé quotidien avec les signaux majeurs vers Slack ou par email.
Implémentation Python
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()Implémentation JavaScript
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)));Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA
Communauté, publications et commentaires imbriqués de n'importe quel subreddit
TikTok
Découverte de vidéos tendance, créateurs et produits