Validar hreflang
Hreflang es esa etiqueta de SEO que falla casi en silencio y casi siempre en pares: se acierta en una dirección y se falla en la recíproca, y los buscadores pueden ignorar todo el grupo.
Ejecutar — gratis
Este endpoint lee una página y lista cada alternativa hreflang que declara —el código de idioma y la URL a la que apunta cada una— y le indica si hay x-default, para que pueda revisar el bloque que emite la página.
Por qué hreflang falla tan seguido
Las anotaciones hreflang exigen que cada versión de idioma o región de una página liste todas las demás versiones, incluida ella misma, y cada uno de esos enlaces debe ser recíproco de forma exacta: si la página en español declara al inglés como alternativa, la página en inglés debe declarar de vuelta al español. Si falta una sola dirección, no se obtiene un resultado parcial; los buscadores documentaron desde temprano que tratan un par de hreflang no recíproco como poco confiable y tienden a ignorarlo, lo que anula silenciosamente todo el propósito de haber agregado las etiquetas.
Qué devuelve el lector
Para una página enviada, la tarea recopila cada alternativa hreflang declarada, lista el código de idioma-región y la URL a la que apunta cada una, informa cuántas hay e indica si existe una alternativa x-default —el respaldo que los buscadores esperan en las páginas pensadas para locales que no coinciden con ningún idioma concreto—. Lee las etiquetas que declara una sola página; no descarga las páginas de destino, así que confirmar que cada enlace es recíproco implica leer las etiquetas de esas otras páginas y comparar las listas.
Una etiqueta con un propósito muy concreto
Hreflang se introdujo en 2011 para resolver un solo problema: indicarle a un buscador qué versión de un contenido casi duplicado servir según el idioma y la región, sin que ese buscador confundiera las versiones con contenido duplicado a secas. No influye en el posicionamiento ni traduce nada por sí sola; es puramente una señal de enrutamiento, y por eso un enlace recíproco roto resulta tan dañino: la señal simplemente deja de ser confiable.
Dónde suele fallar en la práctica
Los fallos más comunes vienen de lanzamientos parciales, donde un mercado nuevo se activa con hreflang agregado solo en las páginas nuevas y nunca se retroalimenta a las existentes, y de plantillas de gestor de contenidos que codifican una lista de idiomas fija que queda desactualizada en cuanto se agrega o retira un mercado. Leer el bloque que emite cada plantilla, página por página, es como se detecta un idioma que se cayó o un código mal escrito antes de que le cueste tráfico.
Ejecutarlo de forma continua
Como los sitios internacionales suelen tener la mayor cantidad de páginas y el mayor movimiento, leer el bloque hreflang después de cada publicación es un hábito barato: se envía una URL, se recibe un task_id de inmediato, y la lista de cada etiqueta hreflang que declara la página llega al webhook cuando termina la descarga. A 0.002 dólares por solicitud, revisar el bloque hreflang de una página después de cada publicación de contenido cuesta una fracción de lo que puede costar en posicionamiento un solo par roto.
Qué puede hacer con ella
Verificación de lanzamiento de mercado
Listar cada alternativa hreflang que declara una nueva sección regional en el momento en que se activa, y confirmar que los códigos y el x-default que espera están todos presentes antes de que los buscadores la indexen.
Auditoría de plantilla tras un despliegue
Leer el bloque hreflang que emite el encabezado de una página después de un lanzamiento y confirmar que la lista de idiomas está completa, un punto habitual donde un mercado se cae en silencio.
Auditoría de x-default
Verificar que las páginas pensadas como respaldo para locales no coincidentes declaren correctamente x-default en lugar de asumir por error un idioma específico.
Validación tras migrar de plataforma
Después de cambiar de plataforma, confirmar que las plantillas nuevas siguen emitiendo la lista completa de alternativas hreflang que espera en cada página.
Preguntas frecuentes
¿Qué devuelve el lector de hreflang?
Lista cada alternativa hreflang que declara una página —cada código de idioma-región y su URL de destino—, informa cuántas hay e indica si existe un x-default.
¿Por qué hreflang necesita ser recíproco?
Los buscadores generalmente ignoran un par hreflang si solo una de las dos páginas lo declara, así que un enlace de vuelta faltante puede invalidar todo el grupo, no solo una página; por eso conviene leer el bloque de cada página y comparar las listas.
¿Puede revisar un grupo de idiomas completo en una sola solicitud?
Lee una página por solicitud y lista las alternativas que esa página declara. Para revisar un grupo completo, ejecute cada página y compare las listas: el lector no descarga por usted las páginas enlazadas.
¿Valida también los códigos de hreflang en sí?
No. Extrae y lista los códigos tal como los declara la página, para que usted detecte errores de tipeo y combinaciones raras, pero no los comprueba contra las tablas ISO 639-1 e ISO 3166-1.
¿Hay un plan gratuito para este endpoint?
La herramienta de arriba es gratis en su navegador. La API es de pago: cada llamada se descuenta de su saldo prepago de ForHosting KIT — se recarga desde $10.00 (no caduca), se paga el precio publicado de cada solicitud, y una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens, y una tarea fallida no se cobra.
¿Cuánto cuesta cada verificación?
0.002 dólares por solicitud, y una descarga fallida se reintenta hasta tres veces antes de devolver un error sin costo alguno.
¿Cómo recibo los resultados?
Por webhook firmado para flujos automatizados, o mediante un enlace firmado válido por 24 horas si prefiere consultarlo manualmente.
¿Lee el hreflang declarado en un sitemap además del HTML?
No. Lee las etiquetas hreflang del HTML de una página. El hreflang declarado en un sitemap se valida con la herramienta de sitemaps.
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/hreflang-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'const res = await fetch("https://api.kit.forhosting.com/seo/hreflang-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://example.com"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/hreflang-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://example.com"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/hreflang-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://example.com"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://example.com"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/hreflang-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
{
"url": "https://example.com"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.hreflang_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. |