Resumen
Este flujo de trabajo monitorea SERP cambios following Google I/O 2026 announcements: AI Mode expansion to 1B+ usuarios, Gemini 3.5 Flash despliegue, Information Agents, y search box redesign. It rastrea ambos organic posicionamiento shifts y AI Overview contenido cambios diario, alerting on significativo movements. Critico for SEO teams responding to el largest Google search actualizacion of 2026.
Desencadenador
Cron programar (diario at 7 AM UTC)
Programación
Ejecuta diario at 7:00 AM UTC
Pasos del flujo de trabajo
Cargar tracked palabras clave
Leer palabras clave siendo monitored for post-I/O SERP cambios.
Consulta con AI Overview extraccion
Search cada palabra clave via Scavio con ai_overview enabled for ambos organic y AI datos.
Comparar contra pre-I/O linea base
Verificar posicion organica cambios y AI Overview contenido differences vs el pre-I/O linea base.
Calcular cambio severity
Puntuacion cada keyword's cambio magnitude: position shifts, nuevo/lost AI citaciones, AI Overview contenido cambios.
Alert on significativo cambios
Enviar alertas for palabras clave con position cambios > 3 o AI citacion estado cambios.
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 monitor_serp_changes(keywords: list[str]) -> dict:
baseline_path = Path("serp_baseline.json")
baseline = json.loads(baseline_path.read_text()) if baseline_path.exists() else {}
current = {}
alerts = []
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,
)
if not res.ok:
continue
data = res.json()
organic_pos = None
for r in data.get("organic", []):
if DOMAIN in r.get("link", ""):
organic_pos = r.get("position")
break
ai_text = data.get("ai_overview", {}).get("text", "")
ai_cited = DOMAIN in ai_text.lower()
current[kw] = {"position": organic_pos, "ai_cited": ai_cited}
prev = baseline.get(kw, {})
if prev.get("position") and organic_pos:
pos_change = organic_pos - prev["position"]
if abs(pos_change) >= 3:
alerts.append({"keyword": kw, "type": "position", "prev": prev["position"], "current": organic_pos, "change": pos_change})
if prev.get("ai_cited") != ai_cited:
alerts.append({"keyword": kw, "type": "ai_citation", "prev": prev.get("ai_cited", False), "current": ai_cited})
baseline_path.write_text(json.dumps(current, indent=2))
date = datetime.utcnow().strftime("%Y-%m-%d")
print(f"SERP Monitor {date}: {len(keywords)} keywords, {len(alerts)} alerts")
for a in alerts:
print(f" [{a['type']}] {a['keyword']}: {a.get('prev')} -> {a.get('current')}")
return {"date": date, "alerts": alerts}
monitor_serp_changes(["best search api", "serp api pricing", "ai overview tracking"])Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
async function monitorChanges(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 match = (data.organic ?? []).find((r) => (r.link ?? "").includes(DOMAIN));
const aiText = data.ai_overview?.text ?? "";
results.push({ keyword: kw, position: match?.position ?? null, aiCited: aiText.toLowerCase().includes(DOMAIN) });
}
console.log(`Monitored ${results.length} keywords`);
return results;
}
await monitorChanges(["best search api", "serp api pricing"]);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA