Genere etiquetas hreflang para páginas multilingües
El generador de etiquetas hreflang convierte una lista estructurada de versiones lingüísticas o regionales en elementos link HTML listos para copiar.
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta página.
Añada cada código regional y su URL absoluta, indique si lo desea un destino general x-default y obtenga tanto registros individuales como un bloque HTML completo. La herramienta valida la sintaxis, normaliza las mayúsculas convencionales, rechaza duplicados y escapa las URL de forma segura. Resulta útil para sitios multilingües, catálogos internacionales, portales de documentación y flujos editoriales que necesitan declarar alternativas de manera coherente.
Prepare un mapa completo de idiomas
Cree una fila por cada página equivalente del mismo conjunto multilingüe o multirregional. Cada fila requiere un código de idioma y una URL HTTP o HTTPS absoluta. Un código básico como es o fr es adecuado si una única página atiende a todas las personas que hablan ese idioma. Añada una región, como es-MX o fr-CA, cuando cambien los precios, la disponibilidad, la ortografía o las condiciones legales. Un subtipo de escritura de cuatro letras distingue alfabetos, por ejemplo zh-Hans o sr-Latn. El generador admite un idioma de dos o tres letras, una escritura opcional y una región opcional de dos letras o tres dígitos. Además, normaliza las mayúsculas habituales para evitar un marcado incoherente. Incluya la página actual junto con sus alternativas: el conjunto debe describirse entero, no limitarse a enlaces salientes. Use URL canónicas, indexables y acordes con el idioma o mercado indicado. El orden de las filas se conserva para que el resultado sea estable y fácil de revisar en el control de versiones.
Elija x-default de forma consciente
Utilice el campo opcional x-default para la página que deba recibir a quienes no encajen en ninguna versión lingüística o regional declarada. Puede ser un selector de idioma, una portada internacional o una versión neutral que permita elegir. No introduzca x-default como fila ordinaria: el campo específico evita declaraciones duplicadas o ambiguas y coloca el destino al final. Puede dejarlo vacío si no existe una alternativa general útil. El HTML devuelto contiene un elemento link por correspondencia y, si se indica, otro para x-default. Inserte el bloque completo en head en todas las páginas del conjunto, o envíe cabeceras Link equivalentes si su aplicación administra las alternativas por HTTP. Mantenga siempre la reciprocidad: cada página debe identificarse a sí misma y al mismo grupo de alternativas. Esta herramienta genera la declaración, pero no comprueba si las páginas remotas publican enlaces recíprocos, son indexables o redirigen. Para ello necesita una auditoría o rastreo independiente.
Valide, publique y mantenga el resultado
Los códigos mal formados se rechazan en lugar de publicarse silenciosamente. Así se detectan guiones bajos, espacios externos, componentes de idioma ausentes, subtipos adicionales no admitidos o x-default dentro de la lista. También se rechazan duplicados después de normalizar, por lo que en-us y en-US no pueden competir. Las URL deben ser absolutas y usar HTTP o HTTPS; las rutas relativas y otros esquemas no sirven para identificar páginas rastreables. Cuando la entrada sea válida, copie el campo html en su plantilla o consuma el array links si su framework genera los metadatos de head. Cada registro ofrece el valor hreflang normalizado, la URL original y la etiqueta terminada. Regenere el bloque cuando cambien las rutas, se abra un mercado o se mueva el destino general. Trate este mapa como configuración mantenida del sitio. En automatizaciones, guarde la entrada junto a las rutas y compare el resultado durante el despliegue. Cada solicitud API cuesta $0.002; el navegador sirve para trabajos puntuales y la API determinista para publicaciones repetibles.
Qué puede hacer con ella
Lanzar una tienda regional
Genere alternativas coherentes para páginas de producto por país y un selector internacional como x-default.
Publicar documentación localizada
Convierta las rutas traducidas en un bloque HTML estable que pueda incluir en cada compilación del sitio.
Automatizar metadatos del CMS
Use la salida estructurada para completar head cuando el equipo editorial añada o mueva páginas traducidas.
Preguntas frecuentes
¿Qué formatos de código regional se aceptan?
Use un idioma de dos o tres letras, seguido opcionalmente por una escritura de cuatro letras y una región de dos letras o tres dígitos, como es, zh-Hans o es-419.
¿El generador incluye x-default?
Sí. Proporcione la URL opcional x_default y su etiqueta se añadirá después de las específicas de cada idioma.
¿Por qué se rechazan los idiomas duplicados?
Cada conjunto debe tener un único destino por valor hreflang. Los códigos se comparan tras normalizar las mayúsculas.
¿Comprueba enlaces recíprocos en las páginas?
No. Crea marcado sin acceder a la red. Utilice un comprobador hreflang o un rastreo para auditar el sitio publicado.
¿Cuánto cuesta una solicitud API?
Cada solicitud API cuesta $0.002. La misma generación determinista también se puede ejecutar en el navegador.
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/web/hreflang-tags-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"locales":[{"locale":"en","url":"https://example.com/en/product"},{"locale":"fr-FR","url":"https://example.com/fr/produit"}]}'const res = await fetch("https://api.kit.forhosting.com/web/hreflang-tags-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/hreflang-tags-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/hreflang-tags-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"locales":[{"locale":"en","url":"https://example.com/en/product"},{"locale":"fr-FR","url":"https://example.com/fr/produit"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"locales":[{"locale":"en","url":"https://example.com/en/product"},{"locale":"fr-FR","url":"https://example.com/fr/produit"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/hreflang-tags-generate", 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
{
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.hreflang_tags_generate",
"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.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
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. |