La autoridad de dominio no es una métrica única que pueda buscar: es una señal compuesta derivada de la frecuencia con la que se clasifica un dominio, dónde se clasifica y qué características SERP posee. Las puntuaciones de DA de terceros de Moz o Ahrefs son estimaciones patentadas que van por detrás de la realidad. Un enfoque basado en SERP consulta varias palabras clave relevantes, cuenta la frecuencia con la que un dominio de destino aparece entre los 10 primeros, realiza un seguimiento de su posición promedio y busca fragmentos destacados o citas de descripción general de IA. Este tutorial construye ese canal utilizando la API de Scavio, produciendo un informe de fortaleza del dominio basado en datos SERP en vivo en lugar de índices de rastreo obsoletos.
Requisitos previos
- Python 3.8 o superior instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una lista de palabras clave de la industria relevantes para el dominio de destino
Guia paso a paso
Paso 1: Definir el dominio de destino y el conjunto de palabras clave
Elija el dominio que desea evaluar y un conjunto de palabras clave que representen su panorama competitivo. Más palabras clave producen una imagen más precisa.
TARGET_DOMAIN = "example.com"
KEYWORDS = [
"best project management tool",
"project management software 2026",
"team collaboration platform",
"agile project tracking",
"free project management app"
]Paso 2: Consultar SERP y extraer datos de clasificación
Para cada palabra clave, obtenga el SERP y verifique si el dominio de destino aparece en los resultados orgánicos. Registre su posición y cualquier característica SERP que posea.
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def analyze_serp(query: str, domain: str) -> dict:
r = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": query, "country_code": "us"}
)
data = r.json()
result = {"query": query, "position": None, "featured_snippet": False, "ai_overview": False}
for item in data.get("organic_results", []):
if domain in item.get("link", ""):
result["position"] = item["position"]
break
snippet = data.get("featured_snippet", {})
if domain in snippet.get("link", ""):
result["featured_snippet"] = True
for src in data.get("ai_overview", {}).get("sources", []):
if domain in src.get("domain", ""):
result["ai_overview"] = True
return resultPaso 3: Agregar métricas en una puntuación de dominio
Calcule la tasa de visibilidad, la posición promedio y la propiedad de las funciones SERP en todas las palabras clave consultadas.
def compute_metrics(results: list[dict]) -> dict:
total = len(results)
ranked = [r for r in results if r["position"] is not None]
positions = [r["position"] for r in ranked]
snippets = sum(1 for r in results if r["featured_snippet"])
ai_cites = sum(1 for r in results if r["ai_overview"])
return {
"keywords_checked": total,
"keywords_ranked": len(ranked),
"visibility_rate": round(len(ranked) / total * 100, 1) if total else 0,
"avg_position": round(sum(positions) / len(positions), 1) if positions else None,
"featured_snippets": snippets,
"ai_overview_citations": ai_cites
}Ejemplo en Python
import os
import json
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def analyze_serp(query: str, domain: str) -> dict:
r = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": query, "country_code": "us"}
)
r.raise_for_status()
data = r.json()
result = {"query": query, "position": None, "featured_snippet": False, "ai_overview": False}
for item in data.get("organic_results", []):
if domain in item.get("link", ""):
result["position"] = item["position"]
break
snippet = data.get("featured_snippet", {})
if domain in snippet.get("link", ""):
result["featured_snippet"] = True
for src in data.get("ai_overview", {}).get("sources", []):
if domain in src.get("domain", ""):
result["ai_overview"] = True
return result
def domain_metrics(domain: str, keywords: list[str]) -> dict:
results = [analyze_serp(kw, domain) for kw in keywords]
ranked = [r for r in results if r["position"] is not None]
positions = [r["position"] for r in ranked]
return {
"domain": domain,
"keywords_checked": len(keywords),
"keywords_ranked": len(ranked),
"visibility_pct": round(len(ranked) / len(keywords) * 100, 1),
"avg_position": round(sum(positions) / len(positions), 1) if positions else None,
"featured_snippets": sum(1 for r in results if r["featured_snippet"]),
"ai_overview_citations": sum(1 for r in results if r["ai_overview"]),
"details": results
}
if __name__ == "__main__":
keywords = ["best project management tool", "project management software 2026", "team collaboration platform"]
report = domain_metrics("example.com", keywords)
print(json.dumps(report, indent=2))Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function analyzeSerp(query, domain) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query, country_code: "us" })
});
const data = await res.json();
const result = { query, position: null, featuredSnippet: false, aiOverview: false };
for (const item of data.organic_results || []) {
if ((item.link || "").includes(domain)) { result.position = item.position; break; }
}
if ((data.featured_snippet?.link || "").includes(domain)) result.featuredSnippet = true;
for (const src of data.ai_overview?.sources || []) {
if ((src.domain || "").includes(domain)) result.aiOverview = true;
}
return result;
}
async function domainMetrics(domain, keywords) {
const results = [];
for (const kw of keywords) results.push(await analyzeSerp(kw, domain));
const ranked = results.filter(r => r.position !== null);
const positions = ranked.map(r => r.position);
console.log(`${domain}: ${ranked.length}/${keywords.length} keywords ranked`);
if (positions.length) console.log(`Avg position: ${(positions.reduce((a,b) => a+b, 0) / positions.length).toFixed(1)}`);
console.log(`Featured snippets: ${results.filter(r => r.featuredSnippet).length}`);
console.log(`AI Overview citations: ${results.filter(r => r.aiOverview).length}`);
}
domainMetrics("example.com", ["best project management tool", "project management software 2026"]).catch(console.error);Salida esperada
{
"domain": "example.com",
"keywords_checked": 5,
"keywords_ranked": 3,
"visibility_pct": 60.0,
"avg_position": 4.7,
"featured_snippets": 1,
"ai_overview_citations": 1,
"details": [
{ "query": "best project management tool", "position": 3, "featured_snippet": true, "ai_overview": false },
{ "query": "project management software 2026", "position": 5, "featured_snippet": false, "ai_overview": true },
{ "query": "team collaboration platform", "position": 6, "featured_snippet": false, "ai_overview": false }
]
}