Resumen
Monitorear un establecer of palabras clave objetivo diario to rastrear cual paginas appear in Google AI Overviews. Comparar your tasa de citacion contra competidores, detectar cuando you gain o lose AI Overview citaciones, y rastrear el overall AEO landscape for your palabra clave cluster.
Desencadenador
Diario cron at 05:00 UTC
Programación
Diario at 05:00 UTC
Pasos del flujo de trabajo
Cargar seguimiento de palabras clave lista
Leer el palabras clave objetivo y your dominio de config. Cada palabra clave rastrea cual dominios fueron cited in yesterday's AI Overview.
Search con AI Overview enabled
For cada palabra clave, consulta Google con AI Overview extraccion enabled. Analizar el AI Overview respuesta for cited URLs.
Extraer citaciones
Pull todos URLs cited in el AI Overview. Record dominio, pagina path, y citacion position.
Comparar to anterior dia
Diff today's citaciones contra yesterday's. Marcar nuevo citaciones gained, citaciones lost, y position cambios.
Generar AEO informe
Salida diario AEO visibilidad metricas: total palabras clave con AI Overviews, your tasa de citacion, competidor citacion rates, y cambios.
Implementacion en Python
import requests, os, json
from urllib.parse import urlparse
from datetime import date
H = {"x-api-key": os.environ["SCAVIO_API_KEY"], "Content-Type": "application/json"}
STATE_FILE = "aeo_state.json"
def track_aeo(keywords, my_domain):
state = {}
try:
with open(STATE_FILE) as f: state = json.load(f)
except FileNotFoundError: pass
today = str(date.today())
results = {"date": today, "keywords": {}}
for kw in keywords:
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers=H, json={"query": kw, "country_code": "us",
"include_ai_overview": True}).json()
aio = resp.get("ai_overview")
citations = []
if aio and aio.get("sources"):
for src in aio["sources"]:
domain = urlparse(src.get("link", "")).netloc
citations.append({"domain": domain, "url": src["link"], "title": src.get("title", "")})
prev_domains = set(state.get(kw, {}).get("domains", []))
curr_domains = set(c["domain"] for c in citations)
my_cited = my_domain in curr_domains
results["keywords"][kw] = {
"has_aio": bool(aio),
"my_cited": my_cited,
"citations": len(citations),
"gained": list(curr_domains - prev_domains),
"lost": list(prev_domains - curr_domains),
}
state[kw] = {"domains": list(curr_domains), "date": today}
with open(STATE_FILE, "w") as f: json.dump(state, f)
cited_count = sum(1 for k in results["keywords"].values() if k["my_cited"])
print(f"AEO Report {today}: cited in {cited_count}/{len(keywords)} AI Overviews")
return results
track_aeo(["serp api pricing", "best search api 2026", "mcp search tools"], "scavio.dev")Implementacion en JavaScript
const H = { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" };
async function trackAEO(keyword, myDomain) {
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({ query: keyword, country_code: "us", include_ai_overview: true })
}).then(r => r.json());
const sources = resp.ai_overview?.sources || [];
const cited = sources.some(s => s.link?.includes(myDomain));
console.log(`"${keyword}": AI Overview ${resp.ai_overview ? "present" : "absent"}, ${cited ? "CITED" : "not cited"} (${sources.length} sources)`);
}
trackAEO("serp api pricing", "scavio.dev");Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA