Un rank tracker no es mas que un script que lanza una busqueda en Google, busca tu dominio en los resultados organicos y guarda la posicion. No necesitas una suscripcion de 129 $/mes en SE Ranking para eso. Este tutorial construye un rastreador diario que toma una lista de keywords y tu dominio, llama al endpoint de Google de Scavio en `POST https://api.scavio.dev/api/v1/google`, encuentra tu sitio en el array `results` y escribe una fila CSV con fecha que puedes graficar. Una consulta completa cuesta 2 creditos (0,01 $); una consulta ligera que solo devuelve resultados organicos cuesta 1 credito (0,005 $). Rastrear 50 keywords a diario sale por unos 7,50 $/mes a 2 creditos cada una, o 3,75 $/mes en modo ligero. Un aviso de entrada: la posicion depende de la ubicacion y de cada busqueda, asi que fija tu pais e idioma y no te obsesiones con un mal dia suelto.
Requisitos previos
- Una API key de Scavio (50 creditos gratis al registrarte, sin tarjeta) desde scavio.dev
- Python 3.9+ o Node.js 18+ instalado
- Soltura basica para ejecutar un script desde la terminal
- Una lista de keywords que quieras rastrear y tu dominio (p. ej. example.com)
Guia paso a paso
Paso 1: 1. Consigue tu API key y guardala como variable de entorno
Registrate en scavio.dev, copia tu key del panel y exportala para que nunca acabe en tu codigo. Todos los endpoints REST de Scavio se autentican con la cabecera `Authorization: Bearer {API_KEY}`.
export SCAVIO_API_KEY="sk_your_key_here"Paso 2: 2. Llama al endpoint de Google con una keyword
Envia un POST a `/api/v1/google` con tu keyword en `query`. Pon `light_request:false` para obtener la respuesta completa (2 creditos) con `results` organicos, `questions`, `knowledge_graph` y `related_searches`. Si solo quieres posiciones, usa `light_request:true` por 1 credito. Fija `gl` (pais) y `hl` (idioma) para medir siempre la misma ubicacion.
curl -X POST https://api.scavio.dev/api/v1/google \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "keyword rank tracker api", "light_request": false, "gl": "us", "hl": "en"}'Paso 3: 3. Busca tu dominio en el array results
La respuesta trae un array `results` con los listados organicos. Recorrelo en orden; la primera entrada cuyo enlace contenga tu dominio es tu posicion. El indice 0 es la posicion 1. Si tu dominio no aparece, guarda la posicion como null (fuera del top), no como cero.
results = data["results"]
rank = None
for i, item in enumerate(results):
if domain in item.get("link", ""):
rank = i + 1
breakPaso 4: 4. Recorre las keywords y escribe una fila CSV con fecha
Itera sobre tu lista de keywords, busca la posicion de cada una y anade una fila con la fecha para ir creando un historial que luego puedas graficar. Una fila por keyword y dia.
import csv, datetime
stamp = datetime.date.today().isoformat()
with open("ranks.csv", "a", newline="") as f:
w = csv.writer(f)
for kw, rank in tracked.items():
w.writerow([stamp, kw, rank if rank else ""])Paso 5: 5. Programalo a diario con cron
Ejecuta el script una vez al dia para que el historial se complete solo. Anade una entrada de crontab que corra a las 8 de la manana. Usa el mismo gl/hl en cada ejecucion para que los numeros sigan siendo comparables.
# crontab -e
0 8 * * * SCAVIO_API_KEY=sk_xxx /usr/bin/python3 /home/me/rank_tracker.py >> /home/me/rank.log 2>&1Ejemplo en Python
import csv
import datetime
import os
import requests
API_KEY = os.environ["SCAVIO_API_KEY"]
DOMAIN = "example.com"
KEYWORDS = [
"keyword rank tracker api",
"serp api",
"google search api",
]
def get_rank(keyword, domain):
resp = requests.post(
"https://api.scavio.dev/api/v1/google",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": keyword, "light_request": False, "gl": "us", "hl": "en"},
timeout=30,
)
resp.raise_for_status()
results = resp.json().get("results", [])
for i, item in enumerate(results):
if domain in item.get("link", ""):
return i + 1
return None
def main():
stamp = datetime.date.today().isoformat()
with open("ranks.csv", "a", newline="") as f:
writer = csv.writer(f)
for kw in KEYWORDS:
rank = get_rank(kw, DOMAIN)
print(f"{stamp} {kw!r} -> {rank if rank else 'not in top results'}")
writer.writerow([stamp, kw, rank if rank else ""])
if __name__ == "__main__":
main()
Ejemplo en JavaScript
import { writeFile, appendFile } from "node:fs/promises";
const API_KEY = process.env.SCAVIO_API_KEY;
const DOMAIN = "example.com";
const KEYWORDS = [
"keyword rank tracker api",
"serp api",
"google search api",
];
async function getRank(keyword, domain) {
const resp = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
query: keyword,
light_request: false,
gl: "us",
hl: "en",
}),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
const results = data.results || [];
for (let i = 0; i < results.length; i++) {
if ((results[i].link || "").includes(domain)) return i + 1;
}
return null;
}
async function main() {
const stamp = new Date().toISOString().slice(0, 10);
for (const kw of KEYWORDS) {
const rank = await getRank(kw, DOMAIN);
console.log(`${stamp} ${kw} -> ${rank ?? "not in top results"}`);
await appendFile("ranks.csv", `${stamp},${kw},${rank ?? ""}\n`);
}
}
main();
Salida esperada
2026-06-30 'keyword rank tracker api' -> 4
2026-06-30 'serp api' -> 12
2026-06-30 'google search api' -> not in top results
ranks.csv ya tiene una fila con fecha por keyword. Anade filas a diario y grafica la columna de posicion con el tiempo. Una sola llamada completa a Google para "keyword rank tracker api" devolvio 9 resultados organicos mas 8 busquedas relacionadas en una respuesta por 2 creditos (0,01 $).