Rapport de densité SEO et détection de suroptimisation
Un rapport de densité transforme une impression vague de répétition en mesures simples et reproductibles.
Lancer gratuitement
Collez le texte de la page, indiquez un mot ou une expression cible, puis choisissez le pourcentage qui doit déclencher un avertissement. Le rapport fournit le nombre exact d’occurrences, la part du texte occupée par le mot-clé et un indicateur de suroptimisation. Son fonctionnement local et déterministe convient aux contrôles éditoriaux, aux processus de publication et aux règles qualité répétables, sans télécharger de page ni deviner son contenu visible.
Mesurez l’expression cible de façon cohérente
L’analyse des mots-clés devient souvent subjective : une personne compte les expressions exactes, une autre inclut des fragments et une troisième estime la fréquence en parcourant le brouillon. Ce rapport applique une règle stable. Il normalise la casse et les formes Unicode compatibles, découpe le texte et le mot-clé en termes, puis recherche la séquence complète. « Chaussure » ne compte pas « chaussures », et « chaussure de course » ne compte que ces mots adjacents dans cet ordre. La ponctuation entre les mots n’empêche pas la correspondance. Les occurrences peuvent se chevaucher, ce qui préserve un décompte mathématiquement complet. total_words donne le dénominateur avec le pourcentage. Fournissez si possible la version visible finale : navigation, balisage masqué et contenu absent de l’entrée ne peuvent agir sur le résultat. La capacité analyse le texte transmis sans récupérer d’URL ; une même entrée produit donc toujours la même réponse, facilement reproductible pendant la révision.
Interprétez la densité et le seuil d’alerte
La densité correspond au nombre de mots occupés par les occurrences, divisé par le nombre total de mots, puis multiplié par 100. Une expression de trois mots trouvée deux fois ajoute donc six mots au numérateur. Cette définition permet de comparer une expression à un terme seul sans minimiser les longues requêtes. Le résultat est arrondi à deux décimales. Réglez threshold sur le pourcentage maximal admis par votre processus ; sa valeur par défaut est 3. over_optimized devient vrai uniquement lorsque la densité dépasse ce seuil, et non lorsqu’elle lui est égale. Cette frontière rend les règles automatiques prévisibles. Un avertissement invite à un examen humain et ne prouve aucune pénalité. Les moteurs ne publient pas de densité idéale universelle, et la répétition naturelle varie selon le sujet, le format, la marque et le vocabulaire technique. Utilisez le seuil comme règle interne, comparez des pages similaires et lisez les passages signalés avant toute modification mécanique.
Intégrez le rapport au processus éditorial
Lancez le rapport après la révision de fond, lorsque titres, appels à l’action, légendes et corps approchent de leur forme publiée. Votre équipe peut conserver le nombre, le pourcentage, le seuil et l’indicateur avec chaque brouillon, puis relancer la même requête après correction pour voir précisément l’évolution. Une agence peut appliquer des seuils différents aux fiches produit, glossaires et articles longs sans modifier le calcul. Vous pouvez aussi l’ajouter à un contrôle avant publication : envoyez le texte et le mot-clé, consultez over_optimized et renvoyez un brouillon signalé à la rédaction avec une explication. Les champs bruts rendent la décision vérifiable. Un texte vide est valide et renvoie zéro mot, occurrence et densité ; un mot-clé vide est refusé faute de cible mesurable. L’algorithme n’utilise ni réseau, ni hasard, ni horloge, ni modèle. Chaque requête API coûte $0.002 ; le navigateur peut appliquer le même calcul pur avant l’automatisation.
Cas d’usage
Contrôlez un brouillon avant publication
Mesurez l’expression cible dans la copie finale et soumettez les répétitions inattendues à une personne chargée de la révision.
Appliquez une règle de qualité éditoriale
Utilisez un seuil explicite dans tout le processus tout en conservant le nombre et le pourcentage justifiant chaque alerte.
Comparez les versions avec cohérence
Gardez les mêmes réglages avant et après correction afin de confirmer la baisse sans changer la méthode de mesure.
Questions fréquentes
Comment la densité du mot-clé est-elle calculée ?
Le nombre de mots occupés par les correspondances exactes est divisé par le total, multiplié par 100, puis arrondi à deux décimales.
La correspondance ignore-t-elle la casse ?
Oui. Texte et mot-clé sont normalisés sans tenir compte de la casse, mais les limites de mots et l’ordre restent déterminants.
Quand une page est-elle signalée comme suroptimisée ?
L’indicateur est vrai lorsque la densité dépasse strictement le seuil fourni, dont la valeur par défaut est 3 pour cent.
Une alerte prouve-t-elle une baisse du classement ?
Non. Il s’agit d’un avertissement éditorial fondé sur votre règle, et non d’une prédiction ou d’une pénalité annoncée.
Combien coûte une requête API ?
Chaque requête coûte $0.002. Le calcul déterministe ne télécharge aucune page et n’emploie aucun modèle externe.
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/seo/keyword-density-report \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Technical SEO helps a site become easier to crawl. A practical technical SEO review checks structure without forcing technical SEO into every sentence.","keyword":"technical SEO"}'const res = await fetch("https://api.kit.forhosting.com/seo/keyword-density-report", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Technical SEO helps a site become easier to crawl. A practical technical SEO review checks structure without forcing technical SEO into every sentence.",
"keyword": "technical SEO"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/keyword-density-report",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Technical SEO helps a site become easier to crawl. A practical technical SEO review checks structure without forcing technical SEO into every sentence.",
"keyword": "technical SEO"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/keyword-density-report", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Technical SEO helps a site become easier to crawl. A practical technical SEO review checks structure without forcing technical SEO into every sentence.","keyword":"technical SEO"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Technical SEO helps a site become easier to crawl. A practical technical SEO review checks structure without forcing technical SEO into every sentence.","keyword":"technical SEO"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/keyword-density-report", 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
{
"text": "Technical SEO helps a site become easier to crawl. A practical technical SEO review checks structure without forcing technical SEO into every sentence.",
"keyword": "technical SEO"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.keyword_density_report",
"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.
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. |