ScavioScavio
ProductoPreciosDocumentación
Iniciar sesionComenzar
  1. Inicio
  2. Tutoriales
  3. Cómo monitorear las posiciones SERP de la competencia con una API
Tutorial

Cómo monitorear las posiciones SERP de la competencia con una API

Cree un rastreador de clasificación SERP diario que almacene las posiciones de la competencia en SQLite y envíe alertas cuando cambie la clasificación. Utiliza la API de búsqueda de Scavio.

Obtener clave API gratisDocumentacion API

Puede monitorear las posiciones SERP de la competencia buscando palabras clave objetivo diariamente a través de API, extrayendo la posición del dominio de los resultados orgánicos, almacenándola en SQLite y alertando cuando la clasificación de un competidor cambia por más de un umbral.

Requisitos previos

  • Python 3.9+
  • Clave API de Scavio
  • SQLite (stdlib)
  • cron o un planificador

Guia paso a paso

Paso 1: Configurar la base de datos de seguimiento

Cree una tabla SQLite para almacenar instantáneas de posición diarias.

Python
import sqlite3

def init_db(path: str = "serp_tracker.db") -> sqlite3.Connection:
    conn = sqlite3.connect(path)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS positions (
            date TEXT,
            keyword TEXT,
            domain TEXT,
            position INTEGER,
            PRIMARY KEY (date, keyword, domain)
        )
    """)
    conn.commit()
    return conn

Paso 2: Extraer posiciones de dominio de los resultados de búsqueda

Busque la palabra clave y encuentre cada dominio rastreado en los resultados orgánicos.

Python
import requests
from datetime import date

API_KEY = "your-scavio-api-key"

def get_positions(keyword: str, domains: list[str]) -> dict:
    r = requests.post(
        "https://api.scavio.dev/api/v1/search",
        json={"query": keyword, "num_results": 20},
        headers={"x-api-key": API_KEY},
        timeout=15
    )
    r.raise_for_status()
    results = r.json().get("organic_results", [])
    positions = {}
    for domain in domains:
        pos = next(
            (i + 1 for i, res in enumerate(results) if domain in res.get("link", "")),
            None
        )
        positions[domain] = pos
    return positions

Paso 3: Almacenar y comparar posiciones

Guarde las posiciones de hoy y compárelas con las de ayer para detectar cambios.

Python
def store_positions(conn, keyword: str, positions: dict):
    today = str(date.today())
    for domain, pos in positions.items():
        conn.execute(
            "INSERT OR REPLACE INTO positions VALUES (?, ?, ?, ?)",
            (today, keyword, domain, pos)
        )
    conn.commit()

def get_yesterday_positions(conn, keyword: str, domains: list) -> dict:
    rows = conn.execute(
        "SELECT domain, position FROM positions WHERE keyword=? ORDER BY date DESC LIMIT ?",
        (keyword, len(domains) * 2)
    ).fetchall()
    # Get second-to-last date for comparison
    dates = conn.execute(
        "SELECT DISTINCT date FROM positions WHERE keyword=? ORDER BY date DESC LIMIT 2",
        (keyword,)
    ).fetchall()
    if len(dates) < 2:
        return {}
    prev_date = dates[1][0]
    rows = conn.execute(
        "SELECT domain, position FROM positions WHERE keyword=? AND date=?",
        (keyword, prev_date)
    ).fetchall()
    return dict(rows)

Paso 4: Alerta sobre cambios de rango

Imprima (o envíe a Slack/correo electrónico) cuando un competidor gane o pierda más de 3 posiciones.

Python
def check_alerts(keyword: str, today_pos: dict, yesterday_pos: dict, threshold: int = 3):
    alerts = []
    for domain, pos in today_pos.items():
        prev = yesterday_pos.get(domain)
        if prev is None or pos is None:
            continue
        change = prev - pos  # positive = rank improved (moved up)
        if abs(change) >= threshold:
            direction = "up" if change > 0 else "down"
            alerts.append(f"{domain} moved {direction} {abs(change)} positions for '{keyword}': {prev} -> {pos}")
    return alerts

# Example run
conn = init_db()
KEYWORDS = ["project management software", "task tracker online"]
DOMAINS = ["asana.com", "monday.com", "notion.so", "clickup.com"]

for kw in KEYWORDS:
    positions = get_positions(kw, DOMAINS)
    yesterday = get_yesterday_positions(conn, kw, DOMAINS)
    store_positions(conn, kw, positions)
    alerts = check_alerts(kw, positions, yesterday)
    for alert in alerts:
        print("ALERT:", alert)

Ejemplo en Python

Python
import requests
import sqlite3
from datetime import date

API_KEY = "your-scavio-api-key"
KEYWORDS = ["project management software", "task tracker for teams", "kanban board online"]
DOMAINS = ["asana.com", "monday.com", "notion.so", "clickup.com", "linear.app"]

def init_db(path="serp_tracker.db"):
    conn = sqlite3.connect(path)
    conn.execute("CREATE TABLE IF NOT EXISTS positions (date TEXT, keyword TEXT, domain TEXT, position INTEGER, PRIMARY KEY (date, keyword, domain))")
    conn.commit()
    return conn

def get_positions(keyword, domains):
    r = requests.post("https://api.scavio.dev/api/v1/search",
                      json={"query": keyword, "num_results": 20},
                      headers={"x-api-key": API_KEY}, timeout=15)
    r.raise_for_status()
    results = r.json().get("organic_results", [])
    return {d: next((i+1 for i, res in enumerate(results) if d in res.get("link","")), None) for d in domains}

def store(conn, keyword, positions):
    today = str(date.today())
    for domain, pos in positions.items():
        conn.execute("INSERT OR REPLACE INTO positions VALUES (?,?,?,?)", (today, keyword, domain, pos))
    conn.commit()

def prev_positions(conn, keyword):
    dates = conn.execute("SELECT DISTINCT date FROM positions WHERE keyword=? ORDER BY date DESC LIMIT 2", (keyword,)).fetchall()
    if len(dates) < 2:
        return {}
    rows = conn.execute("SELECT domain, position FROM positions WHERE keyword=? AND date=?", (keyword, dates[1][0])).fetchall()
    return dict(rows)

def run_tracker():
    conn = init_db()
    for kw in KEYWORDS:
        today_pos = get_positions(kw, DOMAINS)
        yesterday_pos = prev_positions(conn, kw)
        store(conn, kw, today_pos)
        print(f"\nKeyword: {kw}")
        for domain in DOMAINS:
            pos = today_pos.get(domain)
            prev = yesterday_pos.get(domain)
            change = f" (was {prev})" if prev and prev != pos else ""
            print(f"  {domain}: {pos or 'not ranking'}{change}")
    conn.close()

if __name__ == "__main__":
    run_tracker()

Ejemplo en JavaScript

JavaScript
const API_KEY = 'your-scavio-api-key';
const KEYWORDS = ['project management software', 'task tracker for teams'];
const DOMAINS = ['asana.com', 'monday.com', 'notion.so', 'clickup.com'];

async function getPositions(keyword, domains) {
  const res = await fetch('https://api.scavio.dev/api/v1/search', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', 'x-api-key': API_KEY },
    body: JSON.stringify({ query: keyword, num_results: 20 })
  });
  const data = await res.json();
  const results = data.organic_results ?? [];
  return Object.fromEntries(domains.map(d => [
    d,
    (results.findIndex(r => r.link?.includes(d)) + 1) || null
  ]));
}

for (const kw of KEYWORDS) {
  const positions = await getPositions(kw, DOMAINS);
  console.log(`\nKeyword: ${kw}`);
  for (const [domain, pos] of Object.entries(positions)) {
    console.log(`  ${domain}: ${pos ?? 'not ranking'}`);
  }
}

Salida esperada

JSON
Keyword: project management software
  asana.com: 2
  monday.com: 4 (was 6)
  notion.so: 7
  clickup.com: 11
  linear.app: not ranking

ALERT: monday.com moved up 2 positions for 'project management software': 6 -> 4

Tutoriales relacionados

  • Cómo construir un buscador de brechas de palabras clave SEO
  • Cómo crear un agente de auditoría SEO en Claude Code
  • Cómo realizar un seguimiento de productos en los resultados de la descripción general de Google AI

Preguntas frecuentes

La mayoria de los desarrolladores completan este tutorial en 15 a 30 minutos. Necesitaras una clave API de Scavio (el plan gratuito funciona) y un entorno de Python o JavaScript.

Python 3.9+. Clave API de Scavio. SQLite (stdlib). cron o un planificador. Una clave API de Scavio te da 50 creditos gratuitos al registrarte.

Si. El plan gratuito incluye 50 creditos al registrarte, mas que suficiente para completar este tutorial y crear un prototipo funcional.

Scavio tiene un paquete nativo de LangChain (langchain-scavio), un servidor MCP y una API REST simple que funciona con cualquier cliente HTTP. Este tutorial usa the raw REST API, pero puedes adaptarlo al framework que prefieras.

Recursos relacionados

Best Of

La mejor API para informes SEO de agencias en 2026

Read more
Best Of

La mejor API SERP basada en colas en 2026

Read more
Comparison

Semrush API vs Raw SERP API

Read more
Solution

Cree una capa API de SEO de costo predecible

Read more
Use Case

API sin formato del panel de SEO

Read more
Glossary

API de SERP

Read more

Empieza a construir

Cree un rastreador de clasificación SERP diario que almacene las posiciones de la competencia en SQLite y envíe alertas cuando cambie la clasificación. Utiliza la API de búsqueda de Scavio.

Obtener clave API gratuitaLeer la documentacion
ScavioScavio

API de busqueda en tiempo real para agentes de IA. Busca en todas las plataformas, no solo en Google.

Producto

  • Funciones
  • Precios
  • Panel
  • Afiliados

Desarrolladores

  • Documentacion
  • Referencia de API
  • Inicio rapido
  • Integracion MCP
  • Python SDK

Alternativas

  • Alternativa a Tavily
  • Alternativa a SerpAPI
  • Alternativa a Firecrawl
  • Alternativa a Exa

Herramientas

  • Formateador JSON
  • cURL a codigo
  • Contador de tokens
  • Todas las herramientas

© 2026 Scavio. Todos los derechos reservados.

Featured on TAAFT
Terminos de servicioPolitica de privacidad