Resumen
Generative Engine Optimizacion (GEO) es becoming critico as AI Overviews dominate SERPs. Este flujo de trabajo ejecuta cada Monday, toma your top-performing paginas, verifica si they appear in AI Overviews, y flags cumplimiento gaps tal as missing datos estructurados, weak citaciones, o absent entity markup. At $0.005 per credit, auditing 50 paginas costs about $0.25 per semana. Resultados son exported as un prioritized fix lista so your contenido team knows exactamente que to actualizacion.
Desencadenador
Cron Monday 6 AM UTC
Programación
Semanal Monday 6 AM
Pasos del flujo de trabajo
Cargar Pagina Inventory
Leer el lista of top paginas y their palabras clave objetivo de un CSV o base de datos.
Search Cada Palabra clave via Scavio
For cada palabra clave, call Scavio search on Google to capture el full SERP including AI Overview datos.
Detectar AI Overview Presence
Analizar el respuesta to verificar si your URL appears in el AI Overview section o solo in traditional resultados organicos.
Puntuacion GEO Compliance
Evaluar cada pagina contra GEO senales: datos estructurados, citacion density, entity menciones, y authoritative sourcing.
Generar Fix List
Clasificar paginas by cumplimiento gap severity y exportar un prioritized hoja de calculo con especifico recommended fixes.
Implementacion en Python
import requests, os, json, csv
from pathlib import Path
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
SH = {"x-api-key": API_KEY, "Content-Type": "application/json"}
PAGES_FILE = Path("top_pages.csv")
def search_keyword(keyword: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=SH,
json={"query": keyword, "platform": "google"},
timeout=15,
)
resp.raise_for_status()
return resp.json()
def check_ai_overview(serp: dict, target_url: str) -> dict:
ai_overview = serp.get("ai_overview", {})
in_overview = False
if ai_overview:
sources = ai_overview.get("sources", [])
in_overview = any(target_url in s.get("url", "") for s in sources)
organic = serp.get("organic", [])
organic_pos = next((i + 1 for i, r in enumerate(organic) if target_url in r.get("url", "")), None)
return {"in_ai_overview": in_overview, "organic_position": organic_pos}
def run_audit():
results = []
with open(PAGES_FILE) as f:
reader = csv.DictReader(f)
for row in reader:
keyword = row["keyword"]
url = row["url"]
serp = search_keyword(keyword)
presence = check_ai_overview(serp, url)
score = 100
if not presence["in_ai_overview"]:
score -= 40
if presence["organic_position"] is None:
score -= 30
elif presence["organic_position"] > 5:
score -= 15
results.append({
"keyword": keyword,
"url": url,
"geo_score": score,
**presence,
})
results.sort(key=lambda r: r["geo_score"])
out = Path(f"geo_audit_{date.today()}.json")
out.write_text(json.dumps(results, indent=2))
print(f"Audit complete: {len(results)} pages checked")
for r in results[:10]:
print(f" [{r['geo_score']}] {r['keyword']} - AI Overview: {r['in_ai_overview']}")
return results
run_audit()Implementacion en JavaScript
const SH = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const pages = fs.readFileSync('top_pages.csv', 'utf8').trim().split('\n');
const header = pages.shift().split(',');
const rows = pages.map(line => {
const cols = line.split(',');
return {keyword: cols[header.indexOf('keyword')], url: cols[header.indexOf('url')]};
});
async function searchKeyword(keyword) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:SH, body:JSON.stringify({query:keyword, platform:'google'})});
return r.json();
}
function checkAiOverview(serp, targetUrl) {
const aiOverview = serp.ai_overview || {};
const inOverview = (aiOverview.sources || []).some(s => (s.url || '').includes(targetUrl));
const organicPos = (serp.organic || []).findIndex(r => (r.url || '').includes(targetUrl));
return {inAiOverview: inOverview, organicPosition: organicPos >= 0 ? organicPos + 1 : null};
}
const results = [];
for (const row of rows) {
const serp = await searchKeyword(row.keyword);
const presence = checkAiOverview(serp, row.url);
let score = 100;
if (!presence.inAiOverview) score -= 40;
if (presence.organicPosition === null) score -= 30;
else if (presence.organicPosition > 5) score -= 15;
results.push({keyword:row.keyword, url:row.url, geoScore:score, ...presence});
}
results.sort((a,b) => a.geoScore - b.geoScore);
fs.writeFileSync('geo_audit_'+new Date().toISOString().split('T')[0]+'.json', JSON.stringify(results, null, 2));
console.log('Audit complete: '+results.length+' pages');
results.slice(0,10).forEach(r => console.log(' ['+r.geoScore+'] '+r.keyword+' - AI Overview: '+r.inAiOverview));Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA