Gere tags hreflang para páginas multilíngues
O gerador de tags hreflang transforma uma lista estruturada de versões linguísticas ou regionais em elementos link HTML prontos para uso.
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Você informa cada código de localidade e sua URL absoluta, acrescenta se quiser um destino geral x-default e recebe registros individuais e um bloco HTML completo. A ferramenta valida a sintaxe, normaliza maiúsculas e minúsculas, rejeita duplicidades e escapa URLs com segurança. Ela atende sites multilíngues, catálogos internacionais, portais de documentação e fluxos de publicação que precisam declarar páginas alternativas de maneira uniforme.
Monte um mapa completo de localidades
Crie uma linha para cada página equivalente do mesmo conjunto multilíngue ou multirregional. Cada linha precisa de um código de localidade e de uma URL HTTP ou HTTPS absoluta. Um código simples, como pt ou fr, funciona quando uma página atende todas as pessoas daquele idioma. Inclua uma região, como pt-BR ou fr-CA, quando houver diferenças de preço, disponibilidade, grafia ou regras legais. Uma subtaga de escrita com quatro letras diferencia alfabetos, como zh-Hans ou sr-Latn. O gerador aceita idioma de duas ou três letras, escrita opcional e região opcional de duas letras ou três dígitos. Ele também padroniza o uso de maiúsculas para evitar marcação inconsistente. Inclua a página atual e todas as alternativas, pois o conjunto deve ser descrito por inteiro. Use URLs canônicas, indexáveis e específicas para o idioma ou mercado indicado. A ordem informada é mantida na saída, o que deixa os blocos estáveis e facilita a revisão no controle de versão.
Escolha o x-default conscientemente
Use o campo opcional x-default para a página que deve receber visitantes quando nenhuma versão linguística ou regional for adequada. Pode ser um seletor de idioma, uma página internacional ou uma versão neutra que permita escolher o mercado. Não insira x-default como uma localidade comum: o campo próprio evita declarações duplicadas ou ambíguas e posiciona a alternativa no final. Deixá-lo vazio é válido quando não existe um destino geral útil. O HTML retornado contém um elemento link por mapeamento e, quando indicado, outro para x-default. Coloque o bloco inteiro no head de todas as páginas do conjunto ou envie cabeçalhos Link equivalentes caso sua aplicação administre alternativas por HTTP. Preserve a reciprocidade: cada página deve indicar a si mesma e o mesmo grupo de alternativas. A ferramenta produz a declaração corretamente, mas não confirma se páginas remotas publicam os mesmos links, continuam indexáveis ou redirecionam. Faça essas verificações com uma auditoria ou rastreamento separado.
Valide, publique e mantenha a saída
Códigos malformados são recusados em vez de serem emitidos silenciosamente. Isso identifica sublinhados, espaços externos, ausência do idioma, subtagas extras não aceitas ou x-default na lista comum. Duplicidades também são recusadas após a normalização, portanto en-us e en-US não podem criar destinos concorrentes. As URLs precisam ser absolutas e usar HTTP ou HTTPS; caminhos relativos e outros esquemas não identificam páginas rastreáveis. Quando a entrada passar, copie o campo html para seu template ou consuma o array links se seu framework renderizar os metadados do head. Cada registro fornece hreflang normalizado, URL original e tag pronta, facilitando integrações com CMS e pipelines. Gere novamente quando rotas mudarem, um mercado for lançado ou o destino padrão for transferido. Trate o mapeamento como configuração permanente do site. Em automações, mantenha a entrada junto às rotas e compare a saída durante a implantação. Cada solicitação de API custa US$ 0,002; o navegador ajuda em tarefas isoladas e a API determinística em publicações repetíveis.
Casos de uso
Lançar uma loja regional
Gere alternativas consistentes para produtos de cada país e um seletor internacional como x-default.
Publicar documentação localizada
Transforme rotas traduzidas em um bloco HTML estável para incluir em cada compilação do site.
Automatizar metadados do CMS
Use os links estruturados para preencher o head quando editores adicionarem ou moverem traduções.
Perguntas frequentes
Quais formatos de localidade são aceitos?
Use um idioma com duas ou três letras, seguido opcionalmente por escrita de quatro letras e região de duas letras ou três dígitos, como pt, zh-Hans ou es-419.
O gerador inclui x-default?
Sim. Informe a URL opcional x_default e a tag será adicionada depois das alternativas de idioma.
Por que localidades repetidas são recusadas?
Cada conjunto deve ter um destino por valor hreflang. Os códigos são comparados depois da normalização de maiúsculas.
A ferramenta verifica reciprocidade nas páginas?
Não. Ela cria marcação sem acessar a rede. Use um verificador de hreflang ou rastreamento para auditar o site publicado.
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. A mesma geração determinística também funciona no navegador.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.hreflang_tags_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
timeout_sec | 30 |
max_crawl_pages | 25 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |