Resumen
Este flujo de trabajo monitorea competidor marca palabras clave a traves de Google SERP cada dia. It rastrea posicion organica cambios, detecta nuevo contenido de competidores (blog publicaciones, paginas de destino, press lanzamientos), y incluye Reddit mencion counts. El digest correo electronico arrives antes de your manana standup con insights accionables.
Desencadenador
Cron programar (diario at 6:30 AM UTC)
Programación
Diario at 6:30 AM UTC
Pasos del flujo de trabajo
Cargar competidor marca palabras clave
Leer competidor names y branded palabras clave de config. Include variations like 'CompetitorName resena', 'CompetitorName precios', 'CompetitorName vs'.
Search Google for cada palabra clave
Call Scavio Google search for cada branded palabra clave. Record el top 10 posiciones organicas con titles y URLs.
Diff contra ayer
Comparar today's top 10 contra yesterday's almacenado datos. Identificar nuevo URLs (nuevo contenido), position cambios, y disappeared resultados.
Verificar Reddit menciones
Search Reddit for cada competidor nombre via Scavio. Count threads de el last 24 horas to gauge buzz.
Email digest
Format todos cambios en un concise correo electronico digest grouped by competidor. Highlight nuevo contenido y significativo position cambios.
Implementacion en Python
import requests, os, json
from pathlib import Path
SCAVIO_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": SCAVIO_KEY}
COMPETITORS = {"Tavily": ["tavily pricing", "tavily review", "tavily api"],
"Serper": ["serper pricing", "serper review", "serper api"]}
def search_keyword(keyword: str) -> list:
resp = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "google", "query": keyword}, timeout=10)
return [{"pos": r["position"], "title": r["title"], "url": r["link"]}
for r in resp.json().get("organic", [])[:10]]
baseline_path = Path("competitor_baseline.json")
baseline = json.loads(baseline_path.read_text()) if baseline_path.exists() else {}
today = {}
changes = []
for comp, keywords in COMPETITORS.items():
today[comp] = {}
for kw in keywords:
results = search_keyword(kw)
today[comp][kw] = results
old = baseline.get(comp, {}).get(kw, [])
old_urls = {r["url"] for r in old}
new_urls = {r["url"] for r in results}
new_content = new_urls - old_urls
if new_content:
changes.append(f"{comp} [{kw}]: {len(new_content)} new URLs")
baseline_path.write_text(json.dumps(today))
for c in changes:
print(c)Implementacion en JavaScript
import { readFileSync, writeFileSync, existsSync } from "fs";
const COMPETITORS = {
Tavily: ["tavily pricing", "tavily review", "tavily api"],
Serper: ["serper pricing", "serper review", "serper api"],
};
async function searchKeyword(keyword) {
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "google", query: keyword })
});
return ((await resp.json()).organic || []).slice(0, 10).map(r => ({
pos: r.position, title: r.title, url: r.link
}));
}
const baselinePath = "competitor_baseline.json";
const baseline = existsSync(baselinePath) ? JSON.parse(readFileSync(baselinePath, "utf8")) : {};
const today = {};
const changes = [];
for (const [comp, keywords] of Object.entries(COMPETITORS)) {
today[comp] = {};
for (const kw of keywords) {
const results = await searchKeyword(kw);
today[comp][kw] = results;
const oldUrls = new Set((baseline[comp]?.[kw] || []).map(r => r.url));
const newUrls = results.filter(r => !oldUrls.has(r.url));
if (newUrls.length > 0) changes.push(`${comp} [${kw}]: ${newUrls.length} new URLs`);
}
}
writeFileSync(baselinePath, JSON.stringify(today, null, 2));
changes.forEach(c => console.log(c));Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA
Comunidad, publicaciones y comentarios en hilos de cualquier subreddit