Title vs meta description overlap checker
A title and meta description should support the same search intent without saying exactly the same thing.
Run — free
This checker normalizes both fields, measures their unique-word overlap, lists the words they share, and identifies when the description is simply the title repeated one or more times. Use the result to spot wasted description space before publishing, review large batches consistently, or explain a rewrite decision with a transparent metric instead of relying only on a quick visual impression.
What the overlap score tells you
The overlap ratio is a Jaccard score calculated from the unique normalized words in the title and description. The checker counts the words that appear in both fields and divides that count by the number of distinct words appearing across either field. A result of zero means the fields share no normalized words, while a result of one means they use exactly the same unique vocabulary. Values between those endpoints are evidence, not a universal pass or fail grade. Some repetition is useful because the title and description normally discuss the same page, product, or question. Excessive repetition can indicate that the description adds little context, but a low score can also reveal that the fields target different topics. Review the shared-word list alongside the ratio to see whether the overlap comes from meaningful subject terms or generic words. The counts include repeated occurrences in each field for context, although repeated occurrences do not increase the unique-word ratio. This keeps a keyword repeated five times from artificially inflating the comparison.
How text is normalized and repetition is detected
Before comparing the fields, the checker applies Unicode compatibility normalization, converts letters to lowercase using a fixed English locale, and extracts sequences of letters and numbers as words. Apostrophes inside words are retained, so a contraction remains one token, while punctuation around a word does not affect the match. The output is deterministic: it does not call a model, fetch a search result, use a clock, or depend on a browser locale. The repeated-title flag uses a stricter rule than the overlap ratio. It becomes true only when the complete normalized description word sequence is exactly the title sequence repeated one or more times. Therefore, a description containing all title words in a different order may receive a ratio of one but will not be marked as a repeated title. Likewise, adding even one genuinely new word makes the repetition flag false. Empty strings, whitespace-only values, and text containing no recognizable word are rejected because a meaningful ratio cannot be computed from either case.
Turning the result into a better description
Start with the repetition flag. If it is true, rewrite the description so it contributes information that the title cannot fit: a benefit, scope, audience, differentiator, constraint, or useful next step. Then inspect the shared words. Retain the specific terms that connect both fields to the page’s real subject, but avoid filling the description with repeated variants solely to change the score. A good description usually expands the promise made by the title in natural language. When the flag is false, treat the ratio as a diagnostic rather than a target. Compare similar pages within the same site, look for unexpected extremes, and read the actual fields before deciding. The checker does not predict rankings, measure click-through rate, judge character length, or prove that a snippet will be displayed by a search engine. It isolates one narrow editorial question so it can be combined with length checks, keyword review, structured data validation, and human proofreading. Automated workflows can call the API for $0.002 per item and route suspicious records to an editor.
What you can do with it
Review a page before publication
Check that the meta description expands on the title instead of consuming its space with the same wording.
Audit a metadata export
Apply one transparent overlap measure to titles and descriptions exported from a content management system.
Prioritize editorial rewrites
Send records with a repeated-title flag or unusually high overlap to an editor for closer review.
FAQ
What does the overlap ratio mean?
It is the number of unique normalized words shared by both fields divided by the total number of unique words across them.
When is the repeated-title flag true?
It is true when the normalized description word sequence is exactly the normalized title sequence repeated one or more times.
Does punctuation or capitalization change the result?
Capitalization and surrounding punctuation do not change matches. Unicode text is normalized before words are compared.
Is a high overlap ratio always bad?
No. Related fields should share important subject terms. The score is a review signal, not a ranking rule or automatic quality verdict.
What happens if either field is empty?
The request fails with an invalid input error because the comparison requires at least one recognizable word in each field.
How much does the API request cost?
Each item costs $0.002. The calculation is deterministic and does not use a language model or external network service.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/seo/title-description-similarity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Affordable Solar Panels for Homes","description":"Compare affordable solar panels, installation choices, and savings for your home."}'const res = await fetch("https://api.kit.forhosting.com/seo/title-description-similarity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"title": "Affordable Solar Panels for Homes",
"description": "Compare affordable solar panels, installation choices, and savings for your home."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/title-description-similarity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"title": "Affordable Solar Panels for Homes",
"description": "Compare affordable solar panels, installation choices, and savings for your home."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/title-description-similarity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"title":"Affordable Solar Panels for Homes","description":"Compare affordable solar panels, installation choices, and savings for your home."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"title":"Affordable Solar Panels for Homes","description":"Compare affordable solar panels, installation choices, and savings for your home."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/title-description-similarity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"title": "Affordable Solar Panels for Homes",
"description": "Compare affordable solar panels, installation choices, and savings for your home."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.title_description_similarity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |