Générez des balises hreflang pour vos pages multilingues
Le générateur de balises hreflang transforme une liste structurée de versions linguistiques ou régionales en éléments link HTML prêts à intégrer.
Lancer gratuitement
Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.
Vous renseignez chaque code régional et son URL absolue, ajoutez au besoin une destination générale x-default, puis recevez les liens individuels et un bloc HTML complet. L’outil contrôle la syntaxe, normalise la casse conventionnelle, refuse les doublons et protège les attributs HTML. Il convient aux sites multilingues, catalogues internationaux, portails documentaires et chaînes éditoriales qui doivent déclarer leurs variantes de façon cohérente.
Constituez une correspondance complète
Créez une ligne pour chaque page équivalente appartenant au même ensemble multilingue ou multirégional. Chaque ligne exige un code de langue et une URL HTTP ou HTTPS absolue. Un code simple comme fr ou en convient lorsqu’une page sert toutes les personnes parlant cette langue. Ajoutez une région, par exemple fr-CA ou en-GB, si les prix, la disponibilité, l’orthographe ou les conditions juridiques diffèrent. Une sous-étiquette de script à quatre lettres permet de distinguer les systèmes d’écriture, comme zh-Hans ou sr-Latn. Le générateur accepte une langue de deux ou trois lettres, un script facultatif et une région facultative de deux lettres ou trois chiffres. Il normalise leur casse habituelle afin d’éviter un balisage incohérent. Incluez la page actuelle et toutes ses variantes : un ensemble hreflang doit se décrire entièrement. Choisissez des URL canoniques, indexables et propres au public annoncé. L’ordre des lignes reste inchangé, ce qui rend les blocs stables et faciles à relire dans le contrôle de versions.
Choisissez x-default avec discernement
Utilisez le champ x-default facultatif pour la page destinée aux visiteurs auxquels aucune version linguistique ou régionale ne correspond. Il peut s’agir d’un sélecteur de langue, d’un accueil international ou d’une version neutre invitant à choisir. Ne saisissez pas x-default comme une ligne ordinaire : le champ dédié évite les déclarations ambiguës ou en double et place toujours ce recours après les liens localisés. Vous pouvez le laisser vide si aucune destination générale n’est pertinente. Le HTML rendu contient un élément link par correspondance et, si vous le demandez, un élément x-default supplémentaire. Placez le bloc complet dans le head de chaque page de l’ensemble, ou envoyez des en-têtes Link équivalents si votre application gère les variantes au niveau HTTP. Veillez à la réciprocité : chaque page doit mentionner elle-même et les mêmes variantes. L’outil produit la déclaration, mais ne vérifie ni les liens distants, ni l’indexabilité, ni les redirections. Confiez ces contrôles à un audit ou à une exploration distincte.
Validez, publiez et entretenez le résultat
Les codes mal formés sont refusés au lieu d’être produits silencieusement. Vous repérez ainsi les traits de soulignement, espaces extérieurs, langues absentes, sous-étiquettes supplémentaires non prises en charge ou x-default placé dans la liste. Les doublons sont également refusés après normalisation : en-us et en-US ne peuvent donc pas créer deux destinations concurrentes. Les URL doivent être absolues et employer HTTP ou HTTPS ; les chemins relatifs et autres protocoles ne désignent pas des pages explorables. Une fois l’entrée validée, copiez le champ html dans votre modèle ou consommez le tableau links si votre framework génère lui-même les métadonnées du head. Chaque enregistrement expose la valeur hreflang normalisée, l’URL originale et la balise achevée. Régénérez le bloc lorsqu’une route change, qu’un marché ouvre ou que la destination générale déménage. Considérez cette correspondance comme une configuration durable du site. En automatisation, conservez l’entrée avec les routes et comparez le résultat au déploiement. Chaque requête API coûte $0.002 ; le navigateur sert aux besoins ponctuels et l’API déterministe aux publications répétables.
Cas d’usage
Lancer une boutique régionale
Produisez des variantes cohérentes pour les produits de chaque pays et un sélecteur international en x-default.
Publier une documentation localisée
Transformez les routes traduites en bloc HTML stable à intégrer dans chaque compilation du site.
Automatiser les métadonnées du CMS
Exploitez les liens structurés pour renseigner le head dès qu’une traduction est ajoutée ou déplacée.
Questions fréquentes
Quels formats de code régional sont acceptés ?
Utilisez une langue de deux ou trois lettres, suivie éventuellement d’un script de quatre lettres et d’une région de deux lettres ou trois chiffres, comme fr, zh-Hans ou es-419.
Le générateur ajoute-t-il x-default ?
Oui. Indiquez l’URL x_default facultative et sa balise sera ajoutée après les liens linguistiques.
Pourquoi les langues en double sont-elles refusées ?
Un ensemble doit avoir une destination par valeur hreflang. Les codes sont comparés après normalisation de la casse.
L’outil vérifie-t-il la réciprocité des pages ?
Non. Il crée le balisage sans accès réseau. Utilisez un contrôle hreflang ou une exploration pour auditer le site publié.
Combien coûte une requête API ?
Chaque requête API coûte $0.002. La même génération déterministe fonctionne aussi dans le navigateur.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre 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)Exemple de requête
{
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.hreflang_tags_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
timeout_sec | 30 |
max_crawl_pages | 25 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |