Resumen
Este flujo de trabajo ejecuta cada Monday manana, consultas Google for un lista of palabras clave objetivo, registros el position of your dominio in el resultados organicos, y compiles un informe showing position cambios comparado to el anterior semana. El salida es un structured JSON o CSV file ese puede feed paneles de control, correo electronico digests, o Slack notificaciones.
Desencadenador
Cron programar (cada Monday at 7 AM UTC)
Programación
Ejecuta cada Monday at 7 AM UTC
Pasos del flujo de trabajo
Cargar lista de palabras clave
Leer el palabras clave objetivo y associated dominios de un configuracion file o base de datos.
Consulta Google for cada palabra clave
Call el Scavio API con plataforma google for cada palabra clave, requesting suficiente resultados to cover el first two paginas.
Find dominio positions
Scan el resultados organicos for cada palabra clave y registro el position donde el dominio objetivo appears. Mark as not-found if absent de resultados.
Comparar con anterior semana
Cargar last week's positions de storage y compute el delta for cada palabra clave.
Generar informe
Construir un structured informe con palabra clave, actual position, anterior position, y cambio. Exportar as JSON y optionally CSV.
Implementacion en Python
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
DOMAIN = "yourdomain.com"
def get_position(query: str) -> int | None:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query, "num": 20},
timeout=15,
)
res.raise_for_status()
for item in res.json().get("organic", []):
if DOMAIN in item.get("link", ""):
return item["position"]
return None
def run():
keywords = json.loads(Path("keywords.json").read_text())
history_path = Path("rank_history.json")
previous = json.loads(history_path.read_text()) if history_path.exists() else {}
report = []
for kw in keywords:
pos = get_position(kw)
prev = previous.get(kw)
delta = (prev - pos) if (pos and prev) else None
report.append({
"keyword": kw,
"position": pos,
"previous": prev,
"change": delta,
})
if pos:
previous[kw] = pos
history_path.write_text(json.dumps(previous, indent=2))
date_str = datetime.utcnow().strftime("%Y-%m-%d")
Path(f"seo_report_{date_str}.json").write_text(json.dumps(report, indent=2))
print(f"Report generated: {len(report)} keywords tracked")
if __name__ == "__main__":
run()Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
async function getPosition(query) {
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, num: 20 }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
const match = data.organic?.find((r) => r.link?.includes(DOMAIN));
return match ? match.position : null;
}
async function run() {
const fs = await import("fs/promises");
const keywords = JSON.parse(await fs.readFile("keywords.json", "utf8"));
let previous = {};
try {
previous = JSON.parse(await fs.readFile("rank_history.json", "utf8"));
} catch {}
const report = [];
for (const kw of keywords) {
const pos = await getPosition(kw);
const prev = previous[kw] ?? null;
const change = pos && prev ? prev - pos : null;
report.push({ keyword: kw, position: pos, previous: prev, change });
if (pos) previous[kw] = pos;
}
await fs.writeFile("rank_history.json", JSON.stringify(previous, null, 2));
const date = new Date().toISOString().slice(0, 10);
await fs.writeFile(
`seo_report_${date}.json`,
JSON.stringify(report, null, 2)
);
console.log(`Report generated: ${report.length} keywords tracked`);
}
run();Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA