No puedes leer las estadísticas internas de ChatGPT, pero sí medir la señal de fuente que decide lo que dice sobre tu marca: la SERP de Google y Reddit. Este tutorial monta un tracker de share of voice que puntúa cuántas veces tu marca y las de la competencia aparecen en los resultados orgánicos, el panel de conocimiento, People Also Ask y los hilos de Reddit para un conjunto de prompts con intención de compra. Es la versión honesta y reproducible de lo que los hilos de r/MarketingAnalytics describen hacer a mano en una hoja de cálculo: automatizada y anclada en datos que puedes auditar. El método Share of Voice de Scavio de abajo tiene cinco pasos y corre sobre los endpoints de Google y Reddit.
Requisitos previos
- Python 3.8+ o Node 18+ instalado
- Una clave de API de Scavio desde scavio.dev (50 créditos gratis al registrarte)
- requests instalado (pip install requests) para la versión en Python
- Una lista de 10-50 prompts con intención de compra que tus compradores harían a un asistente de IA
Guia paso a paso
Paso 1: Define el conjunto de prompts, no de keywords
El share of voice en respuestas de IA se mide por pregunta, no por keyword. Escribe los prompts que un comprador realmente le hace a un asistente: mejor api serp para agentes de ia, alternativas a dataforseo, herramienta de analítica de tiktok más barata. Con 10-50 prompts basta para empezar. Guárdalos en una lista junto con las marcas que quieres puntuar.
PROMPTS = [
"best serp api for ai agents",
"cheapest dataforseo alternative",
"how to track brand mentions in chatgpt",
]
BRANDS = ["scavio", "tavily", "serpapi", "dataforseo"]Paso 2: Extrae la señal completa de la SERP para cada prompt
Llama al endpoint de Google de Scavio con light_request:false (2 créditos) para que la respuesta incluya los resultados orgánicos más los bloques knowledge_graph, related_searches y questions (People Also Ask). Es justo el material sobre el que se apoyan las AI Overviews y ChatGPT. Auth Bearer, un POST por prompt.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
def serp(prompt):
r = requests.post("https://api.scavio.dev/api/v1/google",
headers=H, json={"query": prompt, "light_request": False})
r.raise_for_status()
return r.json()Paso 3: Cuenta la presencia de marca en orgánico, knowledge graph y PAA
Para cada prompt, escanea los títulos y snippets orgánicos, el knowledge_graph y el bloque questions buscando cada marca. Una mención en el panel de conocimiento o en PAA vale más que un enlace orgánico de la página 2, así que pondéralas. Esto da una puntuación de marca por prompt anclada en lo que la SERP muestra de verdad.
def score_serp(data, brands):
blob = str(data).lower()
scores = {}
for b in brands:
organic = blob.count(b)
kg = 3 if b in str(data.get('knowledge_graph','')).lower() else 0
paa = 2 * str(data.get('questions','')).lower().count(b)
scores[b] = organic + kg + paa
return scoresPaso 4: Añade la capa de indicador adelantado de Reddit
Los LLM se apoyan en Reddit, y la presencia en Reddit suele preceder a las citas en respuestas de IA sobre el mismo tema. Llama al endpoint de búsqueda de Reddit de Scavio (2 créditos) para cada prompt y cuenta las menciones de marca más las puntuaciones de los hilos. Una marca que domina hoy la conversación en Reddit tiende a dominar la respuesta de IA el trimestre siguiente.
def reddit_signal(prompt, brands):
r = requests.post("https://api.scavio.dev/api/v1/reddit/search",
headers=H, json={"query": prompt, "limit": 25})
threads = r.json().get("data", {}).get("posts", [])
blob = " ".join((t.get("title","") + t.get("selftext","")) for t in threads).lower()
return {b: blob.count(b) for b in brands}Paso 5: Calcula el share of voice y guarda una instantánea diaria
Suma las puntuaciones de SERP y Reddit de cada marca en todos los prompts y divide por el total para obtener un porcentaje de share of voice. Añade una fila con fecha a un CSV o base de datos para poder graficar la evolución por semanas. Vuelve a ejecutarlo en un cron diario; a 4 créditos por prompt (2 de SERP + 2 de Reddit), 30 prompts son 120 créditos al día, holgadamente dentro del plan de $30/mes con 7.000 créditos.
def share_of_voice(prompts, brands):
totals = {b: 0 for b in brands}
for p in prompts:
s = score_serp(serp(p), brands)
rd = reddit_signal(p, brands)
for b in brands:
totals[b] += s[b] + rd[b]
grand = sum(totals.values()) or 1
return {b: round(100*v/grand, 1) for b, v in totals.items()}
print(share_of_voice(PROMPTS, BRANDS))Ejemplo en Python
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
BASE = "https://api.scavio.dev/api/v1"
def sov(prompt, brands):
serp = requests.post(f"{BASE}/google", headers=H,
json={"query": prompt, "light_request": False}).json()
reddit = requests.post(f"{BASE}/reddit/search", headers=H,
json={"query": prompt, "limit": 25}).json()
blob = (str(serp) + str(reddit)).lower()
raw = {b: blob.count(b) for b in brands}
total = sum(raw.values()) or 1
return {b: round(100*v/total, 1) for b, v in raw.items()}
print(sov("best serp api for ai agents", ["scavio","tavily","serpapi"]))Ejemplo en JavaScript
const H = { Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`, 'Content-Type': 'application/json' };
const BASE = 'https://api.scavio.dev/api/v1';
async function sov(prompt, brands) {
const [serp, reddit] = await Promise.all([
fetch(`${BASE}/google`, { method: 'POST', headers: H, body: JSON.stringify({ query: prompt, light_request: false }) }).then(r => r.json()),
fetch(`${BASE}/reddit/search`, { method: 'POST', headers: H, body: JSON.stringify({ query: prompt, limit: 25 }) }).then(r => r.json()),
]);
const blob = (JSON.stringify(serp) + JSON.stringify(reddit)).toLowerCase();
const raw = Object.fromEntries(brands.map(b => [b, (blob.match(new RegExp(b, 'g')) || []).length]));
const total = Object.values(raw).reduce((a, b) => a + b, 0) || 1;
return Object.fromEntries(brands.map(b => [b, Math.round((1000 * raw[b]) / total) / 10]));
}
sov('best serp api for ai agents', ['scavio','tavily','serpapi']).then(console.log);Salida esperada
{'scavio': 41.2, 'tavily': 33.7, 'serpapi': 25.1}
# A per-brand share-of-voice percentage across the SERP and Reddit signal for each prompt,
# snapshotted daily so you can chart whether your brand is gaining or losing ground in the
# source material that feeds AI answers.