Esto construye un brief de contenido directamente desde el SERP en vivo: extrae los resultados mejor posicionados, el People Also Ask y las búsquedas relacionadas de una keyword, y luego le entregas esa estructura a Claude para recibir una lista de entidades y un esquema de H2. Automatiza la versión manual que muchos consultores SEO describen en Reddit, leer las 10-15 primeras URL, anotar los subtemas comunes y detectar los huecos, sin que tengas que copiar y pegar SERP a mano. Un límite honesto de entrada: una SERP API devuelve la página de resultados (títulos, snippets, PAA, búsquedas relacionadas), no el cuerpo completo de cada página posicionada. Eso suele bastar para mapear qué subtemas premia el SERP. Si quieres entidades extraídas del cuerpo completo de los artículos, añade un paso de fetch de página después del paso 2. Los resultados completos de Google cuestan 2 créditos en Scavio ($0.005/crédito).
Requisitos previos
- Una API key de Scavio (los 50 créditos gratis del registro bastan para probar esto)
- Una API key de Anthropic para Claude
- Python 3.10+ o Node 18+ con un cliente HTTP
Guia paso a paso
Paso 1: Extrae el SERP completo de tu keyword objetivo
Llama al endpoint de Google con light_request en false para que la respuesta incluya People Also Ask y búsquedas relacionadas, no solo los enlaces orgánicos. Esos dos bloques son la señal más barata de lo que el SERP espera que cubra una página.
import os, requests
API = "https://api.scavio.dev/api/v1/google"
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
# light_request=False adds related_questions + related_searches + knowledge_graph (2 credits)
r = requests.post(API, headers=H, json={"query": "best crm for real estate agents", "light_request": False})
data = r.json()
organic = data["organic_results"] # ranked list: title, link, snippet
paa = data.get("related_questions", []) # People Also Ask: the questions the SERP rewards
related = data.get("related_searches", []) # each item has a "query" fieldPaso 2: Extrae el conjunto posicionado y los bloques de preguntas
Toma los 10-15 primeros resultados orgánicos (título más snippet), cada pregunta de People Also Ask y las búsquedas relacionadas. Juntos forman tu mapa en bruto de entidades y subtemas, los mismos insumos que recogería un brief manual.
top = organic[:15]
brief_input = {
"keyword": "best crm for real estate agents",
"ranking_titles": [o["title"] for o in top],
"ranking_snippets": [o.get("snippet", "") for o in top],
"paa": [q["question"] for q in paa],
"related": [s["query"] if isinstance(s, dict) else s for s in related],
}Paso 3: Pídele a Claude las entidades comunes y los huecos
Envía el SERP estructurado a Claude con un prompt que pida las entidades y subtemas comunes en el conjunto posicionado, además de lo que está poco cubierto. Mantén el prompt específico; un prompt vago te devuelve un esquema genérico.
import anthropic, json
client = anthropic.Anthropic()
prompt = (
"You are an SEO strategist. Below is the live Google SERP for a keyword: "
"ranking titles and snippets, People Also Ask, and related searches. "
"1) List the entities and subtopics shared across the ranking pages. "
"2) Flag subtopics that appear in PAA or related searches but are thin in the "
"ranking titles (content gaps). 3) Return an H2 outline that covers both.\n\n"
+ json.dumps(brief_input, indent=2)
)
msg = client.messages.create(
model="claude-sonnet-5", max_tokens=1500,
messages=[{"role": "user", "content": prompt}],
)
print(msg.content[0].text)Paso 4: Opcional: enriquece con el cuerpo completo de las páginas
Si las entidades a nivel de snippet no bastan, descarga el cuerpo de cada URL posicionada con tu propio crawler o paso de fetch y añade el texto extraído a brief_input antes de la llamada a Claude. Así obtienes entidades a nivel de artículo a cambio de una ejecución más lenta.
# add a fetched-body field per URL, then re-run the Claude step
brief_input["ranking_bodies"] = [fetch_text(o["link"]) for o in top] # your fetcherEjemplo en Python
import os, requests
API = "https://api.scavio.dev/api/v1/google"
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
# light_request=False adds related_questions + related_searches + knowledge_graph (2 credits)
r = requests.post(API, headers=H, json={"query": "best crm for real estate agents", "light_request": False})
data = r.json()
organic = data["organic_results"] # ranked list: title, link, snippet
paa = data.get("related_questions", []) # People Also Ask: the questions the SERP rewards
related = data.get("related_searches", []) # each item has a "query" fieldEjemplo en JavaScript
const H = {
Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`,
"Content-Type": "application/json",
};
const res = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST",
headers: H,
body: JSON.stringify({ query: "best crm for real estate agents", light_request: false }),
});
const data = await res.json();
const organic = data.organic_results;
const paa = data.related_questions ?? []; // People Also AskSalida esperada
La llamada a Google devuelve organic_results (title, link, snippet), related_questions (los bloques de People Also Ask) y related_searches. Claude devuelve tres secciones: una lista de entidades comunes, una lista de huecos de contenido a partir del PAA y las búsquedas relacionadas, y un esquema de H2. Toda la ejecución es una petición a Google (2 créditos) más una llamada a Claude por keyword.