Saltar al contenido
SEOReport
API v1 · gratis

API de SEO Report

Lanza la misma auditoría del informe web desde tu aplicación: SEO técnico, rendimiento, contenido, competencia, autoridad, visibilidad en IA y recomendaciones, en JSON.

Autenticación

Envía tu clave en la cabecera Authorization de cada petición. Las claves se crean en Panel → API; solo necesitas una cuenta gratuita.

Cabecera

Authorization: Bearer sr_live_xxxxxxxxxxxxxxxxxxxxxxxx

Endpoint

POST https://seoreport.es/api/v1/analyze

Cuerpo en JSON con un único campo:

CampoTipoObligatorioDescripción
urlstringSíPágina a analizar. Si no lleva protocolo se usa https://.

La respuesta tarda entre 20 y 80 segundos: usa un timeout de al menos 90 s.

Respuesta

200 OK · application/json

{
  "cached": false,
  "report_id": "api_686a...",
  "result": {
    "url": "https://ejemplo.com",
    "domain": "ejemplo.com",
    "analyzed_at": "2026-10-12T12:00:00+02:00",
    "overall_score": 72,
    "score_breakdown": {
      "technical": 80,
      "keywords": 70,
      "ai_visibility": 60,
      "backlinks": 55
    },
    "technical": { ... },
    "backlinks": { ... },
    "keywords": { ... },
    "competitors": { ... },
    "ai_visibility": { ... },
    "recommendations": { ... },
    "page_info": {
      "title": "Ejemplo — Mi Web",
      "final_url": "https://ejemplo.com/",
      "load_time_ms": 843,
      "page_size_kb": 124.5,
      "https": true
    },
    "notices": [],              // partes omitidas, si las hay
    "ai_narrative": { ... }
  }
}

Con "cached": true el resultado viene de un análisis de la misma URL de las últimas 24 horas: no gasta cupo.

Errores

Los errores devuelven {"error": "mensaje"} con estos códigos:

CódigoMotivo
400Falta url, o no es una dirección pública válida
401Clave ausente, incorrecta o revocada
405Método distinto de POST
422No se pudo acceder a la página
429Límite diario alcanzado o demasiados análisis a la vez
500Error interno: vuelve a intentarlo más tarde

Ejemplos

cURL

curl -X POST https://seoreport.es/api/v1/analyze \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sr_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -d '{"url": "https://tuwebsite.com"}'

PHP

<?php
$response = file_get_contents('https://seoreport.es/api/v1/analyze', false,
  stream_context_create(['http' => [
    'method'  => 'POST',
    'header'  => "Content-Type: application/json\r\nAuthorization: Bearer sr_live_xxxx",
    'content' => json_encode(['url' => 'https://tuwebsite.com']),
    'timeout' => 90,
  ]])
);
$data = json_decode($response, true);
echo $data['result']['overall_score']; // 72

JavaScript

const res = await fetch('https://seoreport.es/api/v1/analyze', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer sr_live_xxxx'
  },
  body: JSON.stringify({ url: 'https://tuwebsite.com' })
});
const data = await res.json();
console.log(data.result.overall_score); // 72

Python

import requests

response = requests.post(
    'https://seoreport.es/api/v1/analyze',
    headers={'Authorization': 'Bearer sr_live_xxxx'},
    json={'url': 'https://tuwebsite.com'},
    timeout=90
)
data = response.json()
print(data['result']['overall_score'])  # 72

Límites

La API es gratuita y comparte el cupo de tu cuenta: 10 análisis nuevos al día, como máximo 2 a la vez. Los resultados servidos desde caché no cuentan.

Si un día se agota el presupuesto global de alguna fuente (IA, búsqueda o PageSpeed), el informe omite esa parte y lo explica en result.notices; nunca devuelve datos vacíos como si fueran reales.