Informe de densidad SEO: detecte la sobreoptimización
Un informe de densidad convierte una impresión imprecisa de repetición en medidas pequeñas y reproducibles.
Ejecutar — gratis
Pegue el texto de la página, indique una palabra o frase objetivo y elija el porcentaje que debe activar una advertencia. El informe devuelve el número exacto de apariciones, la proporción del texto ocupada por la palabra clave y una señal de sobreoptimización. Funciona de forma local y determinista, por lo que resulta apropiado para revisiones editoriales, flujos de publicación y reglas de calidad repetibles sin descargar páginas ni adivinar su contenido visible.
Mida la frase objetivo con un criterio constante
Las revisiones de palabras clave suelen volverse subjetivas: una persona cuenta frases exactas, otra incluye palabras parciales y otra estima la frecuencia al leer el borrador. Este informe aplica una sola regla estable. Normaliza mayúsculas, minúsculas y formas Unicode compatibles, divide el texto y la palabra clave en términos y busca la secuencia completa. «Zapato» no cuenta «zapatos», y «zapato para correr» solo cuenta esas palabras adyacentes y en ese orden. La puntuación intermedia no impide una coincidencia. Las apariciones pueden solaparse, algo importante en construcciones repetidas. El recuento responde así a una pregunta precisa. total_words muestra el denominador junto al porcentaje. Proporcione, si es posible, la copia visible definitiva: las etiquetas de navegación, el marcado oculto y cualquier contenido ausente de la entrada no afectan al resultado. Como la capacidad analiza el texto enviado y no obtiene una URL, una misma entrada siempre produce la misma respuesta y puede reproducirse durante la revisión.
Interprete la densidad y el umbral de aviso
La densidad es el número de palabras ocupadas por coincidencias, dividido entre el total de palabras y multiplicado por 100. Una frase de tres palabras encontrada dos veces aporta seis palabras al numerador. Así, la densidad de una frase puede compararse con la de un término individual sin infravalorar expresiones largas. El resultado se redondea a dos decimales. Configure threshold con el porcentaje máximo aceptado por su proceso; el valor predeterminado es 3. over_optimized solo se activa cuando la densidad supera el umbral, no cuando coincide exactamente con él, lo que hace predecibles las reglas automáticas. La advertencia invita a una revisión humana y no demuestra una penalización. Los buscadores no publican una densidad ideal universal, y la repetición natural depende del tema, formato, marca y vocabulario técnico. Use el umbral como regla interna, compare páginas similares y lea los fragmentos señalados antes de editar. Eliminar mecánicamente cada repetición puede reducir la claridad de un texto correcto.
Integre el informe en su flujo editorial
Ejecute el informe después de la edición sustantiva, cuando títulos, llamadas a la acción, pies y cuerpo estén cerca de su versión publicada. Su equipo puede guardar recuento, porcentaje, umbral y señal junto a cada borrador, y repetir la solicitud tras los cambios para mostrar qué varió. Las agencias pueden aplicar límites distintos a productos, glosarios y artículos largos sin modificar el cálculo. También puede incluirlo en un control previo a la publicación: envíe texto y palabra clave, consulte over_optimized y devuelva el borrador señalado a una persona editora con una explicación. Los campos hacen auditable la decisión. Un texto vacío es válido y produce cero palabras, apariciones y densidad; una palabra clave vacía se rechaza porque no existe un objetivo medible. El algoritmo no usa red, azar, reloj ni modelo, por lo que los lotes son deterministas. Cada solicitud API cuesta $0.002; el navegador puede aplicar el mismo cálculo puro antes de automatizarlo.
Qué puede hacer con ella
Revise un borrador antes de publicarlo
Mida la frase principal en la copia final y envíe a revisión humana los borradores con repeticiones inesperadas.
Aplique una regla de calidad de contenido
Use un umbral explícito en todo el flujo y conserve el recuento y porcentaje que justifican cada alerta.
Compare revisiones de forma coherente
Ejecute los mismos ajustes antes y después de editar para comprobar que bajó la repetición sin cambiar el método.
Preguntas frecuentes
¿Cómo se calcula la densidad de palabras clave?
Se dividen las palabras ocupadas por coincidencias exactas entre el total, se multiplica por 100 y se redondea a dos decimales.
¿La coincidencia ignora mayúsculas y minúsculas?
Sí. Texto y palabra clave se normalizan sin distinguir el caso, pero se conservan los límites y el orden de la frase.
¿Cuándo se marca una página como sobreoptimizada?
La señal se activa si la densidad es estrictamente mayor que el umbral indicado, cuyo valor predeterminado es 3 por ciento.
¿Una alerta demuestra que bajará el posicionamiento?
No. Es una advertencia editorial basada en su regla, no una predicción ni una afirmación de penalización del buscador.
¿Cuánto cuesta una solicitud API?
Cada solicitud cuesta $0.002. El cálculo determinista no descarga páginas ni utiliza modelos externos.
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/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)Ejemplo de solicitud
{
"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"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.keyword_density_report",
"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. |