Resumen
Este flujo de trabajo genera un completo informe semanal combining traditional organic posicionamientos con AI Mode citacion seguimiento. It consultas palabras clave objetivo via Scavio con AI Overview extraccion, calculates un GEO visibilidad puntuacion, compara week-over-week tendencias, y salidas un structured informe suitable for stakeholder resena. Designed for SEO teams y agencies reporting on AI search visibilidad post-Google I/O 2026.
Desencadenador
Cron programar (cada Monday at 8 AM UTC)
Programación
Ejecuta cada Monday at 8:00 AM UTC
Pasos del flujo de trabajo
Cargar palabra clave establecer y anterior semana datos
Leer palabras clave objetivo y cargar last week's informe for comparacion.
Consulta palabras clave con AI Overview
Search cada palabra clave via Scavio con ai_overview enabled. Extraer organic posicionamientos y AI Overview text.
Calcular GEO visibilidad puntuacion
Compute citacion frecuencia, position weighting, y composite GEO puntuacion.
Comparar week-over-week
Calcular cambios in posiciones organicas, citacion conteo, y GEO puntuacion vs anterior semana.
Generar informe
Salida structured JSON informe con resumen metricas, palabra clave detalles, y tendencia datos.
Implementacion en Python
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
DOMAIN = "yourdomain.com"
def generate_report(keywords: list[str]) -> dict:
results = []
for kw in keywords:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": kw, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
ai_text = data.get("ai_overview", {}).get("text", "")
organic_pos = None
for r in data.get("organic", []):
if DOMAIN in r.get("link", ""):
organic_pos = r.get("position")
break
results.append({
"keyword": kw,
"organic_position": organic_pos,
"ai_cited": DOMAIN in ai_text.lower(),
"has_ai_overview": len(ai_text) > 0,
})
cited = sum(1 for r in results if r["ai_cited"])
in_top10 = sum(1 for r in results if r["organic_position"] and r["organic_position"] <= 10)
geo_score = round(cited / len(results), 3) if results else 0
date = datetime.utcnow().strftime("%Y-%m-%d")
report = {
"date": date,
"total_keywords": len(keywords),
"organic_top10": in_top10,
"ai_citations": cited,
"geo_score": geo_score,
"details": results,
}
# Load previous for comparison
prev_path = Path("weekly_report_latest.json")
if prev_path.exists():
prev = json.loads(prev_path.read_text())
report["prev_geo_score"] = prev.get("geo_score", 0)
report["geo_score_change"] = round(geo_score - prev.get("geo_score", 0), 3)
Path(f"weekly_report_{date}.json").write_text(json.dumps(report, indent=2))
prev_path.write_text(json.dumps(report, indent=2))
return report
keywords = json.loads(Path("target_keywords.json").read_text()) if Path("target_keywords.json").exists() else ["best search api 2026", "serp api comparison"]
report = generate_report(keywords)
print(f"Weekly Report: {report['ai_citations']}/{report['total_keywords']} AI citations, GEO score: {report['geo_score']}")Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
async function generateReport(keywords) {
const results = [];
for (const kw of keywords) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: kw, ai_overview: true }),
});
const data = await res.json();
const aiText = data.ai_overview?.text ?? "";
const match = (data.organic ?? []).find((r) => (r.link ?? "").includes(DOMAIN));
results.push({ keyword: kw, organicPos: match?.position ?? null, aiCited: aiText.toLowerCase().includes(DOMAIN) });
}
const cited = results.filter((r) => r.aiCited).length;
console.log(`Weekly: ${cited}/${keywords.length} AI citations, GEO: ${(cited / keywords.length).toFixed(3)}`);
return results;
}
await generateReport(["best search api 2026", "serp api comparison"]);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA