GEO (optimización generativa del motor) es el cambio de marca de 2026 de SEO para motores de respuesta de IA. Una herramienta de auditoría GEO verifica la presencia, el porcentaje de citas y la estructura del contenido en ChatGPT, Perplexity y Gemini. Este tutorial crea una auditoría de puntuación simple respaldada por Scavio.
Requisitos previos
- Python 3.10+
- Una clave API de Scavio
- Un panel de consulta (20-50 consultas de destino)
- Tu dominio
Guia paso a paso
Paso 1: Ejecute cada consulta en todos los motores
Cobertura de ChatGPT, Perplexity, Gemini (descripción general de IA).
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def run(query):
engines = ['chatgpt', 'perplexity']
out = {}
for e in engines:
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': e, 'query': query})
out[e] = r.json()
ov = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': query, 'include': ['ai_overview']}).json().get('ai_overview')
out['gemini_overview'] = ov
return outPaso 2: Puntuación de presencia de citas por motor
1 punto por motor donde se cita tu dominio.
def score_query(resp, domain):
score = 0
for e, r in resp.items():
srcs = r.get('citations', []) + r.get('sources', []) if isinstance(r, dict) else []
if any(domain in s.get('url', '') for s in srcs):
score += 1
return scorePaso 3: Estructura del contenido de la auditoría
Verifique que sus páginas tengan un esquema de preguntas frecuentes, títulos claros y párrafos cortos.
def structure_check(url):
html = requests.get(url).text
return {
'has_faq_schema': 'FAQPage' in html,
'headings': html.count('<h2'),
'paragraphs': html.count('<p')
}Paso 4: Calcular la puntuación GEO general
Media ponderada de presencia + estructura.
def geo_score(presence_score, structure):
return 0.7 * presence_score + 0.3 * min(structure['headings'] / 5, 1)Paso 5: Generar una lista de acciones
Marque las consultas en las que esté ausente con correcciones de contenido sugeridas.
def actions(results, domain):
return [q for q, s in results.items() if s['presence'] == 0]Ejemplo en Python
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
QUERIES = ['best ai agent framework', 'how to build a rag agent']
DOMAIN = 'scavio.dev'
score = 0
for q in QUERIES:
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'perplexity', 'query': q})
if any(DOMAIN in s.get('url', '') for s in r.json().get('sources', [])):
score += 1
print(f'GEO coverage: {score}/{len(QUERIES)}')Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const QUERIES = ['best ai agent framework'];
const DOMAIN = 'scavio.dev';
let score = 0;
for (const q of QUERIES) {
const r = 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: 'perplexity', query: q })
});
const d = await r.json();
if (d.sources?.some(s => s.url.includes(DOMAIN))) score++;
}
console.log(`GEO coverage: ${score}/${QUERIES.length}`);Salida esperada
Per-query GEO report with score, missing engines, and content structure gaps. Typical first-run score: 15-30% coverage on B2B SaaS, improvable to 60%+ in 90 days.