El problema
Los equipos verifican manualmente si su contenido aparece en Google AI Overviews buscando keywords en un navegador. Esto no escala mas alla de 10-20 keywords y pierde cambios de citacion de competidores.
La solucion de Scavio
Consulta Scavio con include_ai_overview para cada keyword, extrae los dominios de citacion y compara contra tu dominio. Rastrea ganancias y perdidas de citaciones diariamente. Costo: $0.005/keyword.
Antes
Antes de automatizar, una estratega de GEO revisaba manualmente 15 keywords semanales en pestanas de navegador en modo incognito. Descubria cambios de citacion 1-2 semanas despues de que ocurrian, demasiado tarde para reaccionar.
Después
Despues de automatizar, 100 keywords se verifican diariamente ($0.50/dia). Los cambios de citacion se detectan en 24 horas. El informe semanal por email muestra: keywords ganadas, keywords perdidas, tendencias de citacion de competidores. Costo mensual: $15.
Para quien es
Profesionales de SEO, estrategas de GEO, gestores de contenido y equipos de marketing que rastrean visibilidad en AI Overview.
Beneficios clave
- Monitorea 100 keywords diariamente por $0.50/dia
- Detecta cambios de citacion en 24 horas
- Rastrea dominios de competidores en citaciones de AI Overview
- Informes de tendencias semanales a partir de datos historicos
- Integracion MCP para monitoreo impulsado por agentes
Ejemplo en Python
import requests, os, json
from datetime import date
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def check_citations(keywords, my_domain, history_file='aio_history.json'):
try:
with open(history_file) as f: history = json.load(f)
except FileNotFoundError: history = {}
today = date.today().isoformat()
changes = []
for kw in keywords:
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'query': kw, 'country_code': 'us',
'include_ai_overview': True}).json()
aio = data.get('ai_overview') or {}
cited_domains = [s.get('domain', '') for s in aio.get('sources', [])]
was_cited = history.get(kw, {}).get('cited', False)
is_cited = my_domain in str(cited_domains)
if is_cited != was_cited:
changes.append({'keyword': kw, 'change': 'gained' if is_cited else 'lost'})
history[kw] = {'cited': is_cited, 'domains': cited_domains, 'date': today}
with open(history_file, 'w') as f: json.dump(history, f)
return changes
changes = check_citations(['best crm 2026', 'crm comparison'], 'mysite.com')
for c in changes: print(f"{c['change'].upper()}: {c['keyword']}")Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = require('fs');
async function checkCitations(keywords, myDomain) {
let history = {};
try { history = JSON.parse(fs.readFileSync('aio_history.json')); } catch {}
const changes = [];
for (const kw of keywords) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({query: kw, country_code: 'us', include_ai_overview: true})
}).then(r => r.json());
const domains = ((r.ai_overview || {}).sources || []).map(s => s.domain || '');
const isCited = domains.some(d => d.includes(myDomain));
const wasCited = history[kw]?.cited || false;
if (isCited !== wasCited) changes.push({keyword: kw, change: isCited ? 'gained' : 'lost'});
history[kw] = {cited: isCited, domains, date: new Date().toISOString().split('T')[0]};
}
fs.writeFileSync('aio_history.json', JSON.stringify(history));
return changes;
}
checkCitations(['best crm 2026'], 'mysite.com').then(c => c.forEach(x => console.log(`${x.change}: ${x.keyword}`)));Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA