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. Este endpoint comprueba cada alternativa hreflang declarada contra la página a la que apunta y confirma que el enlace de vuelta realmente existe.
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta 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é comprueba el validador
Para una página o grupo enviado, la tarea recopila cada alternativa hreflang declarada, sigue cada enlace y confirma que la página de destino incluya una anotación de vuelta que apunte de regreso. También valida los códigos de idioma-región contra los estándares ISO 639-1 e ISO 3166-1 que exige la especificación, detecta la omisión frecuente de x-default en páginas pensadas como respaldo, y marca cuando falta la autorreferencia hreflang que los buscadores esperan en cada página del grupo.
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. Los sitios que mezclan hreflang en el encabezado HTML con una declaración aparte en el sitemap también tienden a que ambas fuentes se desincronicen, ya que la mayoría de los equipos solo revisa una de las dos.
Ejecutarlo de forma continua
Como los sitios internacionales suelen tener la mayor cantidad de páginas y el mayor movimiento, esta es una de las verificaciones más valiosas para automatizar: se envía el grupo, se recibe un task_id de inmediato, y el informe completo de reciprocidad llega al webhook cuando termina el rastreo. A 0.002 dólares por solicitud, validar un grupo de idiomas completo 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
Confirmar que cada alternativa hreflang es recíproca en el momento en que se activa una nueva sección regional del sitio, antes de que los buscadores tengan ocasión de ignorarla.
Reconciliación entre sitemap y HTML
Detectar los casos donde el hreflang declarado en el sitemap no coincide con el del encabezado de la página, una fuente común de inconsistencia silenciosa.
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 generando un grupo hreflang totalmente recíproco en cada idioma y región.
Preguntas frecuentes
¿Qué comprueba la API de validación de hreflang?
Confirma que cada alternativa hreflang declarada tiene su enlace recíproco en la página de destino, valida los códigos de idioma-región contra los estándares ISO, y marca autorreferencias o etiquetas x-default faltantes.
¿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.
¿Puede verificar un grupo de idiomas completo en una sola solicitud?
Sí, se envía el conjunto de URLs que forman el grupo y la tarea devuelve un informe de reciprocidad por cada par.
¿Valida también los códigos de hreflang en sí?
Sí, los códigos se comprueban contra los estándares ISO 639-1 de idioma e ISO 3166-1 de región, detectando errores de tipeo y combinaciones inválidas.
¿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 un rastreo fallido 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.
¿Verifica el hreflang declarado en un sitemap además del HTML?
Sí, ambas fuentes pueden enviarse, que es justamente cómo el verificador detecta cuando las dos se han desincronizado.
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, y pronto desde nuestra app, el email y Telegram.
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://ejemplo.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://ejemplo.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://ejemplo.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://ejemplo.com"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://ejemplo.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://ejemplo.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. |