Comprobar etiquetas rel prev y next de paginación
El comprobador de etiquetas rel de paginación valida si una serie ordenada de páginas forma una cadena coherente.
Ejecutar — gratis
Indique la URL de cada página junto con el destino presente en sus etiquetas rel=prev y rel=next. El resultado identifica enlaces ausentes, enlaces indebidos en los extremos, autorreferencias, URL duplicadas y destinos que omiten una página o apuntan al vecino equivocado. La comparación es exacta, determinista y no solicita ninguna página, por lo que resulta idónea para controles de compilación, exportaciones de rastreadores y auditorías técnicas de SEO reproducibles.
Describa la serie en el orden previsto
Comience por la página que los buscadores y los visitantes deben considerar como inicio de la serie y añada después todas las páginas posteriores en secuencia. En cada registro, introduzca la URL absoluta de la página y los destinos declarados por sus etiquetas rel=prev y rel=next. El comprobador interpreta el orden del conjunto como el orden canónico que usted afirma. Así, la relación esperada queda inequívoca: la página dos debe señalar a la página uno como anterior, la página uno debe señalar a la página dos como siguiente y la misma regla debe mantenerse en toda la serie. El primer registro debe omitir prev porque nada lo precede, mientras que el último debe omitir next porque nada lo sigue. Utilice los destinos reales de las etiquetas, no las URL que esperaba que generasen las plantillas. Una entrada exacta permite revelar diferencias sutiles, como una barra final distinta, otro parámetro de consulta o un enlace que salta directamente de la página dos a la cuatro. Se rechazan las listas con menos de dos registros porque no permiten demostrar una relación de paginación.
Interprete cada incidencia notificada
Un resultado válido significa que cada par adyacente concuerda en ambas direcciones: la página anterior apunta hacia la posterior y esta enlaza de vuelta con la anterior. Una incidencia missing_link indica que falta una relación exigida por el orden suministrado. unexpected_link aparece cuando la primera página declara prev o la última declara next, con lo que la cadena se prolongaría fuera de la serie enviada. mismatched_link señala un destino distinto del vecino inmediato esperado y puede revelar páginas omitidas, valores obsoletos de una plantilla o registros colocados en orden incorrecto. self_link indica que una página se apunta a sí misma en vez de a otro miembro de la serie. Las URL repetidas reciben una incidencia propia porque hacen ambiguo el orden declarado, aunque las cadenas cercanas parezcan coincidir. Cada incidencia incluye la posición de la página empezando por uno, su URL, el campo afectado, el destino esperado y el destino real. El comprobador no visita las URL ni determina si responden; únicamente evalúa las relaciones facilitadas.
Integre el resultado en un proceso de calidad SEO
Ejecute esta comprobación después de extraer los elementos de enlace de páginas renderizadas, de una exportación de rastreo o de una prueba de plantilla. En integración continua, convierta el resultado en una condición de publicación y exija que valid sea true antes de desplegar una plantilla de paginación. Durante una auditoría, conserve las incidencias junto a la captura del rastreo para que el equipo de desarrollo pueda reproducir la relación exacta que falló sin volver a rastrear el sitio. La comparación es deliberadamente exacta después de retirar los espacios exteriores. No se normalizan las cadenas de consulta, no se eliminan fragmentos, no se equipara HTTP con HTTPS ni se presupone que las barras finales sean equivalentes, porque esas transformaciones podrían ocultar un problema real de canonicalización. Corrija las etiquetas de origen o el orden enviado y repita la misma comprobación hasta que el número de incidencias sea cero. La herramienta del navegador sirve para revisiones manuales; las solicitudes automatizadas cuestan $0.002 cada una y devuelven la misma estructura determinista. Para una cobertura completa, combínela con comprobaciones separadas de códigos de estado, etiquetas canonical, indexabilidad y HTML renderizado.
Qué puede hacer con ella
Probar una plantilla antes de publicarla
Envíe los destinos generados a un control de compilación y detenga el despliegue si las páginas adyacentes no se enlazan entre sí.
Revisar una exportación de rastreo
Convierta los destinos prev y next extraídos en registros ordenados y localice enlaces omitidos, obsoletos o indebidos.
Verificar una migración
Compruebe que las URL de paginación reescritas aún forman la cadena prevista tras cambiar rutas, parámetros o reglas de barras finales.
Preguntas frecuentes
¿El comprobador visita las URL indicadas?
No. No realiza solicitudes de red y solo valida las URL ordenadas y los destinos de las etiquetas rel que usted proporciona.
¿Qué ocurre si facilito una sola página?
La solicitud se rechaza como entrada no válida porque hacen falta al menos dos páginas para validar una relación de paginación.
¿Debe la primera página incluir rel=prev?
No. La primera página debe omitir prev; cualquier destino anterior no vacío en ese registro se notifica como inesperado.
¿Se normalizan las URL que parecen equivalentes?
No. Salvo por la retirada de espacios exteriores, las URL se comparan exactamente para no ocultar diferencias de canonicalización.
¿Qué demuestra un resultado válido?
Demuestra que las etiquetas suministradas coinciden con el orden facilitado en ambas direcciones. No demuestra que las páginas respondan, rendericen esas etiquetas o sean indexables.
¿Cuánto cuesta una comprobación automatizada?
Cada solicitud de API cuesta $0.002. La versión para navegador se ejecuta localmente para las comprobaciones interactivas.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/seo/pagination-tags-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pages":[{"url":"https://example.com/articles?page=1","next":"https://example.com/articles?page=2"},{"url":"https://example.com/articles?page=2","prev":"https://example.com/articles?page=1","next":"https://example.com/articles?page=3"},{"url":"https://example.com/articles?page=3","prev":"https://example.com/articles?page=2"}]}'const res = await fetch("https://api.kit.forhosting.com/seo/pagination-tags-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pages": [
{
"url": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=2"
},
{
"url": "https://example.com/articles?page=2",
"prev": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=3"
},
{
"url": "https://example.com/articles?page=3",
"prev": "https://example.com/articles?page=2"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/pagination-tags-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pages": [
{
"url": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=2"
},
{
"url": "https://example.com/articles?page=2",
"prev": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=3"
},
{
"url": "https://example.com/articles?page=3",
"prev": "https://example.com/articles?page=2"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/pagination-tags-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pages":[{"url":"https://example.com/articles?page=1","next":"https://example.com/articles?page=2"},{"url":"https://example.com/articles?page=2","prev":"https://example.com/articles?page=1","next":"https://example.com/articles?page=3"},{"url":"https://example.com/articles?page=3","prev":"https://example.com/articles?page=2"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pages":[{"url":"https://example.com/articles?page=1","next":"https://example.com/articles?page=2"},{"url":"https://example.com/articles?page=2","prev":"https://example.com/articles?page=1","next":"https://example.com/articles?page=3"},{"url":"https://example.com/articles?page=3","prev":"https://example.com/articles?page=2"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/pagination-tags-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"pages": [
{
"url": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=2"
},
{
"url": "https://example.com/articles?page=2",
"prev": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=3"
},
{
"url": "https://example.com/articles?page=3",
"prev": "https://example.com/articles?page=2"
}
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.pagination_tags_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |