Resumen
Este flujo de trabajo archives un full SERP snapshot for palabras clave objetivo cada semana. Cada snapshot captures posiciones organicas, AI Overview presence, fragmentos destacados, People Also Ask questions, y local pack resultados. Over time, el archive habilita competitive analisis de tendencias, algorithm actualizacion impact measurement, y caracteristica SERP evolution seguimiento.
Desencadenador
Cron programar (cada Sunday at 6:00 AM UTC)
Programación
Ejecuta cada Sunday at 6:00 AM UTC
Pasos del flujo de trabajo
Cargar lista de palabras clave
Leer el lista of palabras clave to archive de configuracion. Estos deberia incluye your tracked palabras clave plus competitive terms.
Consulta full SERP for cada palabra clave
Call Scavio con num=20 y ai_overview=true to capture el full SERP estado including todos caracteristicas.
Extraer structured snapshot datos
Analizar cada respuesta en un structured snapshot: positions, dominios, caracteristicas, PAA questions, y AI Overview contenido.
Archive to storage
Agregar el semanal snapshot to el historico archive con un marca de tiempo for serie temporal analisis.
Implementacion en Python
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
KEYWORDS = [
"best SERP API 2026",
"search API for AI agents",
"web scraping API alternative",
"MCP search server",
"Google SERP data structured",
]
def snapshot_keyword(keyword: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword, "num": 20, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
return {
"keyword": keyword,
"organic": [
{
"position": r.get("position"),
"domain": r.get("link", "").split("/")[2] if "/" in r.get("link", "") else "",
"title": r.get("title", ""),
}
for r in data.get("organic", [])[:20]
],
"has_ai_overview": bool(data.get("ai_overview")),
"ai_overview_preview": (data.get("ai_overview", {}) or {}).get("text", "")[:300],
"has_featured_snippet": bool(data.get("featured_snippet")),
"people_also_ask": [q.get("question", "") for q in data.get("people_also_ask", [])],
"has_local_pack": bool(data.get("local_pack")),
}
def run():
date = datetime.utcnow().strftime("%Y-%m-%d")
snapshots = [snapshot_keyword(kw) for kw in KEYWORDS]
# Save weekly snapshot
archive_dir = Path("serp_archive")
archive_dir.mkdir(exist_ok=True)
snapshot_path = archive_dir / f"snapshot_{date}.json"
snapshot_path.write_text(json.dumps({"date": date, "keywords": len(KEYWORDS), "snapshots": snapshots}, indent=2))
# Summary
aio_count = sum(1 for s in snapshots if s["has_ai_overview"])
snippet_count = sum(1 for s in snapshots if s["has_featured_snippet"])
local_count = sum(1 for s in snapshots if s["has_local_pack"])
print(f"Archived {len(KEYWORDS)} keywords for {date}")
print(f" AI Overviews: {aio_count}/{len(KEYWORDS)}")
print(f" Featured Snippets: {snippet_count}/{len(KEYWORDS)}")
print(f" Local Packs: {local_count}/{len(KEYWORDS)}")
print(f" Credits used: {len(KEYWORDS)}")
if __name__ == "__main__":
run()Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
const KEYWORDS = ["best SERP API 2026", "search API for AI agents", "web scraping API alternative"];
async function snapshotKeyword(keyword) {
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: keyword, num: 20, ai_overview: true }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
return {
keyword,
organic: (data.organic ?? []).slice(0, 20).map((r) => ({ position: r.position, domain: r.link ? new URL(r.link).hostname : "", title: r.title ?? "" })),
hasAiOverview: !!data.ai_overview,
hasFeaturedSnippet: !!data.featured_snippet,
paa: (data.people_also_ask ?? []).map((q) => q.question ?? ""),
};
}
const snapshots = [];
for (const kw of KEYWORDS) snapshots.push(await snapshotKeyword(kw));
const aio = snapshots.filter((s) => s.hasAiOverview).length;
console.log(`Archived ${KEYWORDS.length} keywords: ${aio} with AI Overviews`);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA