Las descripciones generales de IA de Google ahora aparecen en más del 40% de las consultas informativas en 2026. Ser citado en una descripción general de IA genera un número significativo de clics incluso cuando su página no se encuentra entre los 3 primeros resultados orgánicos. El nuevo informe de clasificación realiza un seguimiento de qué consultas citan su dominio y cuáles no. Este tutorial crea un rastreador de citas que verifica una lista de consultas de destino, registra si su dominio aparece en las fuentes de AI Overview y registra los resultados a lo largo del tiempo para el análisis de tendencias. Cada cheque cuesta un crédito API de Scavio a $0,005.
Requisitos previos
- Python 3.9+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una lista de consultas de destino relevantes para su dominio
Guia paso a paso
Paso 1: Definir consultas de destino y dominio
Configure una lista de consultas de las que desea realizar un seguimiento para las citas de descripción general de AI. Estas deben ser consultas informativas en las que espera que su contenido sea relevante.
import os, requests, json, time
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
URL = 'https://api.scavio.dev/api/v1/search'
TARGET_DOMAIN = 'scavio.dev'
QUERIES = [
'best search api for developers',
'how to get google search results programmatically',
'serp api comparison 2026',
'web search api for ai agents',
'mcp search server',
]Paso 2: Consulte la cita de descripción general de AI para una sola consulta
Busque con include_ai_overview habilitado y verifique si el dominio de destino aparece en la lista de fuentes de descripción general de AI.
def check_citation(query: str, domain: str) -> dict:
resp = requests.post(URL, headers=H,
json={'query': query, 'country_code': 'us', 'include_ai_overview': True})
data = resp.json()
ai = data.get('ai_overview', {})
sources = ai.get('sources', [])
cited = False
citation_position = None
for i, src in enumerate(sources):
if domain in src.get('link', ''):
cited = True
citation_position = i + 1
break
organic = data.get('organic_results', [])
organic_pos = None
for r in organic:
if domain in r.get('link', ''):
organic_pos = r.get('position')
break
return {
'query': query,
'ai_overview_present': bool(ai.get('text')),
'cited': cited,
'citation_position': citation_position,
'organic_position': organic_pos,
'total_ai_sources': len(sources),
'timestamp': datetime.now().isoformat(),
}Paso 3: Verifique por lotes todas las consultas y guarde los resultados
Repita todas las consultas de destino, verifique las citas y guarde los resultados en un archivo JSON para realizar un seguimiento histórico.
def track_citations(queries: list, domain: str) -> list:
results = []
for q in queries:
result = check_citation(q, domain)
results.append(result)
status = 'CITED' if result['cited'] else 'MISSING'
print(f'[{status}] "{q}" | AI src #{result["citation_position"]} | Organic #{result["organic_position"]}')
time.sleep(0.5)
# Save snapshot
snapshot = {'date': datetime.now().strftime('%Y-%m-%d'), 'domain': domain, 'results': results}
filename = f'ai_citations_{snapshot["date"]}.json'
with open(filename, 'w') as f:
json.dump(snapshot, f, indent=2)
cited_count = sum(1 for r in results if r['cited'])
print(f'\nCitation rate: {cited_count}/{len(results)} ({cited_count/len(results)*100:.0f}%)')
print(f'Saved to {filename}')
return results
results = track_citations(QUERIES, TARGET_DOMAIN)Paso 4: Comparar citas a lo largo del tiempo
Cargue instantáneas anteriores y compare el estado de las citas para detectar ganancias y pérdidas en la visibilidad de la descripción general de AI.
def compare_snapshots(current_file: str, previous_file: str):
with open(current_file) as f:
current = json.load(f)
with open(previous_file) as f:
previous = json.load(f)
prev_map = {r['query']: r['cited'] for r in previous['results']}
print(f'Citation changes: {previous["date"]} -> {current["date"]}')
for r in current['results']:
was_cited = prev_map.get(r['query'], False)
is_cited = r['cited']
if is_cited and not was_cited:
print(f' [GAINED] {r["query"]}')
elif not is_cited and was_cited:
print(f' [LOST] {r["query"]}')
elif is_cited:
print(f' [KEPT] {r["query"]}')
# compare_snapshots('ai_citations_2026-05-16.json', 'ai_citations_2026-05-09.json')Ejemplo en Python
import os, requests, time, json
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def check_ai_citation(query, domain):
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': query, 'country_code': 'us', 'include_ai_overview': True})
data = resp.json()
sources = data.get('ai_overview', {}).get('sources', [])
cited = any(domain in s.get('link', '') for s in sources)
pos = next((i+1 for i, s in enumerate(sources) if domain in s.get('link', '')), None)
return {'query': query, 'cited': cited, 'position': pos}
queries = ['search api for developers', 'serp api python', 'web search mcp server']
for q in queries:
r = check_ai_citation(q, 'scavio.dev')
print(f'[{"CITED" if r["cited"] else "MISS"}] {q} (pos: {r["position"]})')
time.sleep(0.5)Ejemplo en JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function checkAICitation(query, domain) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, country_code: 'us', include_ai_overview: true })
});
const data = await resp.json();
const sources = data.ai_overview?.sources || [];
const cited = sources.some(s => (s.link || '').includes(domain));
const pos = sources.findIndex(s => (s.link || '').includes(domain)) + 1 || null;
console.log(`[${cited ? 'CITED' : 'MISS'}] ${query} (pos: ${pos})`);
}
const queries = ['search api for developers', 'serp api python'];
(async () => { for (const q of queries) await checkAICitation(q, 'scavio.dev'); })();Salida esperada
[CITED] "best search api for developers" | AI src #2 | Organic #4
[MISSING] "how to get google search results programmatically" | AI src #None | Organic #7
[CITED] "serp api comparison 2026" | AI src #1 | Organic #3
[MISSING] "web search api for ai agents" | AI src #None | Organic #12
[CITED] "mcp search server" | AI src #3 | Organic #2
Citation rate: 3/5 (60%)
Saved to ai_citations_2026-05-16.json