Un redactor IA que escribe solo a partir de los datos de entrenamiento produce posts genéricos que los AI Overviews ya responden, así que nunca reciben clics ni citas. La solución es el anclaje: antes de que el modelo escriba, extrae la SERP de Google en vivo para el tema y aliméntale las preguntas de People Also Ask, las búsquedas relacionadas y las páginas que ahora mismo posicionan. El borrador responde entonces a las subpreguntas exactas que Google está mostrando hoy, estructurado como están las páginas que se citan. Este tutorial construye ese bucle con el endpoint de Google de Scavio en unas 30 líneas. Es el mismo patrón que los marketers de Reddit describen ejecutar a diario a través de MCP para autopublicar posts con voz de marca.
Requisitos previos
- Python 3.9+ y la librería requests
- Una clave de API de Scavio (50 créditos gratis al registrarte)
- Cualquier LLM al que puedas llamar para el paso de redacción (Claude, GPT, un modelo local)
Guia paso a paso
Paso 1: Configura tu clave de API
Guarda la clave en una variable de entorno, no en el código fuente. Scavio usa autenticación Bearer en todos los endpoints REST.
export SCAVIO_API_KEY=sk_your_key_herePaso 2: Extrae la SERP completa de tu tema
Pon light_request en false (2 créditos) para que la respuesta incluya los bloques de questions (People Also Ask) y related_searches junto a las páginas que posicionan. Esas son las subpreguntas que tu borrador debe responder para ser citado.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}",
"Content-Type": "application/json"}
def serp_brief(topic):
# full SERP (2 credits) gives related_searches + People Also Ask to mine subtopics
r = requests.post("https://api.scavio.dev/api/v1/google",
headers=H, json={"query": topic, "light_request": False}).json()
paa = [q["question"] for q in r.get("questions", [])]
related = r.get("related_searches", [])
top = [{"title": x["title"], "link": x["link"], "snippet": x.get("snippet","")}
for x in r.get("results", [])[:8]]
return {"people_also_ask": paa, "related": related, "ranking_pages": top}
brief = serp_brief("how to clean a cast iron skillet")
# Feed brief into your writer prompt so the draft answers the questions
# Google is actually surfacing and cites the pages currently ranking.Paso 3: Construye el prompt del redactor a partir del brief
Le estás entregando al modelo la curva de demanda real del tema, no pidiéndole que se la imagine. La lista de PAA se convierte en tu estructura de H2, que es también como los motores de respuesta trocean una página.
brief = serp_brief("how to clean a cast iron skillet")
h2s = "\n".join("- " + q for q in brief["people_also_ask"])
prompt = f"""Write a 900-word guide on: how to clean a cast iron skillet.
Answer the title question in the first sentence (no intro).
Then answer each of these real questions, each as its own H2:
{h2s}
Cover these related angles where relevant: {', '.join(brief['related'])}
Match the depth of the pages currently ranking; do not pad."""Paso 4: Genera y vuelve a comprobar antes de publicar
El anclaje no es de una sola vez. Volver a extraer la SERP de forma programada te dice cuándo un post se ha desviado de lo que la gente pregunta ahora, que es tu disparador de actualización.
draft = your_llm(prompt) # call whatever model you use
# Re-pull the SERP weekly and diff the PAA list.
# New questions appearing = a content-refresh signal for that post.
fresh = serp_brief("how to clean a cast iron skillet")
new_qs = set(fresh["people_also_ask"]) - set(brief["people_also_ask"])
if new_qs:
print("Refresh with:", new_qs)Ejemplo en Python
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}",
"Content-Type": "application/json"}
def serp_brief(topic):
# full SERP (2 credits) gives related_searches + People Also Ask to mine subtopics
r = requests.post("https://api.scavio.dev/api/v1/google",
headers=H, json={"query": topic, "light_request": False}).json()
paa = [q["question"] for q in r.get("questions", [])]
related = r.get("related_searches", [])
top = [{"title": x["title"], "link": x["link"], "snippet": x.get("snippet","")}
for x in r.get("results", [])[:8]]
return {"people_also_ask": paa, "related": related, "ranking_pages": top}
brief = serp_brief("how to clean a cast iron skillet")
# Feed brief into your writer prompt so the draft answers the questions
# Google is actually surfacing and cites the pages currently ranking.Ejemplo en JavaScript
const H = { Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`, "Content-Type": "application/json" };
async function serpBrief(topic) {
const r = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST", headers: H,
body: JSON.stringify({ query: topic, light_request: false })
}).then(r => r.json());
return {
peopleAlsoAsk: (r.questions || []).map(q => q.question),
related: r.related_searches || [],
ranking: (r.results || []).slice(0, 8).map(x => ({ title: x.title, link: x.link }))
};
}Salida esperada
{
"people_also_ask": [
"Can you use soap on a cast iron skillet?",
"How do you clean cast iron after cooking?",
"Why is my cast iron sticky after seasoning?"
],
"related": ["cast iron cleaning rust", "cast iron seasoning oil"],
"ranking_pages": [ { "title": "How to Clean Cast Iron...", "link": "https://..." } ]
}