Meta description length checker
A meta description has little room to explain why a searcher should visit your page.
Run — free
This checker counts the characters in your draft, compares the total with the recommended 120–160 range, and clearly marks descriptions that are too short or at risk of truncation. It gives writers, editors, and SEO teams a fast, consistent check without rewriting the copy or making subjective claims about ranking performance. Run it here or automate the same deterministic test through the API.
Understand what the checker measures
Paste the exact meta description you plan to publish. The checker counts Unicode characters, which means a visible emoji or another character outside the basic multilingual plane counts once rather than as two internal code units. It then compares that total with the recommended minimum of 120 characters and maximum of 160 characters. A result inside that inclusive range is marked recommended. A shorter result is marked too short, while a result above 160 is marked too long and receives a truncation-risk flag. The response also says how many characters are needed to reach the minimum or how many exceed the maximum. Those distances make revisions easier because you can see the size of the change required without repeatedly counting by hand. The tool does not inspect HTML, fetch a webpage, judge writing quality, or promise how a particular search engine will display the snippet. It performs one transparent length check on the text you provide.
Use the range as an editorial signal
The 120–160 range is a practical writing target, not a guarantee that every search result will show every character. Search engines may build a different snippet from page content, vary the displayed space by device or query, and truncate copy according to rendered width rather than a simple character total. Treat a too-long result as a useful warning that important words near the end may not appear. Move the page’s clearest benefit, topic, or action toward the beginning before cutting secondary detail. When a description is too short, add specific information that helps a searcher distinguish the page instead of padding it with repeated keywords. A description inside the range still needs to be accurate, readable, and aligned with the page. This checker deliberately separates the objective measurement from editorial judgment: it tells you whether the count fits the chosen range, while your team remains responsible for relevance, tone, truthfulness, and a natural reason to click.
Build a repeatable publishing check
For a single page, paste the final draft and review the status before publishing. For a content pipeline, send each proposed description through the API and store the returned character count, status, and truncation-risk value with your editorial checks. You can block empty input, route short descriptions back to a writer, and flag long descriptions for review without changing their text automatically. Because the algorithm has no network calls, randomness, or time-dependent behavior, the same input produces the same result in a browser, build process, or continuous integration job. Keep the submitted text identical to the value placed in the page’s meta tag; leading and trailing spaces are counted when present because they are part of the supplied string, although an input containing only whitespace is rejected as empty. Recheck descriptions after localization because character counts change across languages. This English capability measures any Unicode text, but it does not translate copy or substitute locale-specific editorial guidance.
What you can do with it
Review a page before publication
Check the final meta description and catch an empty, short, or overlong draft before the page goes live.
Audit a content migration
Apply one consistent 120–160 character rule while moving descriptions into a new CMS or site structure.
Add a CI content check
Use the deterministic API result to flag descriptions that require editorial review during a build.
FAQ
What range does the checker recommend?
It treats 120 through 160 characters, including both boundaries, as the recommended range.
Does a result over 160 guarantee truncation?
No. It flags truncation risk because actual snippets can vary by query, device, rendered width, and search engine behavior.
How are emoji counted?
The algorithm counts Unicode code points, so an emoji represented by one code point counts as one character.
Are spaces included in the count?
Yes. Every supplied character, including leading, trailing, and internal spaces, is counted. Whitespace-only input is rejected.
What does the API cost?
Each API request costs $0.002. The same deterministic check can also run free in the browser.
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/meta-description-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Discover practical ways to improve your website performance, strengthen search visibility, and give every visitor a faster, clearer experience."}'const res = await fetch("https://api.kit.forhosting.com/seo/meta-description-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Discover practical ways to improve your website performance, strengthen search visibility, and give every visitor a faster, clearer experience."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/meta-description-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Discover practical ways to improve your website performance, strengthen search visibility, and give every visitor a faster, clearer experience."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/meta-description-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Discover practical ways to improve your website performance, strengthen search visibility, and give every visitor a faster, clearer experience."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Discover practical ways to improve your website performance, strengthen search visibility, and give every visitor a faster, clearer experience."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/meta-description-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "Discover practical ways to improve your website performance, strengthen search visibility, and give every visitor a faster, clearer experience."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.meta_description_check",
"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. |