Check URL slug SEO quality
A URL slug is a small piece of a page, but it carries useful information for search engines and people deciding whether to click.
Run — free
This checker gives you a repeatable review before publishing. Enter a slug and its target keyword to see whether the length is sensible, whether common filler words add clutter, and how many meaningful keyword terms appear. The result includes individual checks, matched and missing terms, a transparent score, and specific issues you can act on without pretending to predict a search ranking.
Read the result as a practical editing checklist
Start with the individual checks rather than treating the overall score as a ranking forecast. The length check passes slugs from three through sixty characters, a broad range that keeps the address readable without forcing every page into the same shape. The stop-word check identifies common English connectors such as “the,” “of,” and “for.” Their presence is not automatically disastrous, but removing an unnecessary connector often produces a cleaner address. The keyword-relevance check compares complete normalized words, so a partial character match cannot inflate the result. It reports the exact meaningful target terms that matched and those that are missing. Together, these details tell an editor what changed the score and make the result easy to review. A high result means the slug satisfied these defined mechanical checks; it does not mean the page will rank, because content quality, competition, links, technical health, and search intent remain outside this capability’s scope.
Understand how target-keyword relevance is measured
The checker normalizes both inputs to lowercase Latin letters and numbers, splits them into words, and removes common English stop words from the target keyword. Repeated target terms count once. It then measures coverage: the number of unique meaningful target terms present as complete slug words divided by the total number of meaningful target terms. Coverage of one means every relevant term appears; coverage of one half means half appear. A slug passes the relevance check at fifty percent or higher. This method is intentionally deterministic and easy to audit. It does not use synonyms, stemming, search volumes, embeddings, or a language model, so it will not claim that two different words mean the same thing. Use the missing-term list as an editing prompt, not an instruction to stuff every word into the address. When a long keyword contains modifiers that are unimportant to the page’s identity, a concise slug with partial coverage can still be the better editorial decision.
Use the checker before publishing and during migrations
Run the check while a page is still a draft, when changing the slug costs almost nothing. Supply the keyword that best represents the page’s actual search intent, not a collection of loosely related phrases. If an issue appears, edit the proposed slug and compare the new result while keeping it natural and recognizable. The same deterministic output also works in editorial automation: a content system can flag weak proposals for review, store check details beside an approval, or enforce a team’s baseline without making a network request. During a site migration, use it to inspect proposed destination paths before redirects are finalized. Remember that changing a published URL has consequences beyond this score. Preserve valuable existing URLs when possible, and use an appropriate redirect when a change is necessary. The API request costs $0.002, while the browser version can support quick manual checks. In either channel, the algorithm uses no live SERP data and returns the same result for the same inputs.
What you can do with it
Review a draft article slug
Check a proposed path against the article’s primary keyword before an editor publishes the page.
Add a CMS quality flag
Run a deterministic check when an author saves a draft and send unclear slugs to editorial review.
Audit migration destinations
Evaluate new path segments for migrated pages before redirect mappings and launch plans are finalized.
FAQ
What does one API check cost?
Each API request costs $0.002. The same deterministic checker can also run in the browser.
Does a good score guarantee higher rankings?
No. It confirms only the stated slug checks; rankings depend on many page, site, query, and competitive factors.
How is keyword relevance calculated?
It is the share of unique meaningful target-keyword terms found as complete normalized words in the slug.
Are all stop words bad in a slug?
No. The checker flags them for review because some are unnecessary, but clarity can justify keeping one.
Can I submit a full URL?
Yes. The checker removes a query or fragment and evaluates only the final non-trailing path segment.
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/slug-seo-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"slug":"best-running-shoes-women","target_keyword":"best running shoes for women"}'const res = await fetch("https://api.kit.forhosting.com/seo/slug-seo-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"slug": "best-running-shoes-women",
"target_keyword": "best running shoes for women"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/slug-seo-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"slug": "best-running-shoes-women",
"target_keyword": "best running shoes for women"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/slug-seo-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"slug":"best-running-shoes-women","target_keyword":"best running shoes for women"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"slug":"best-running-shoes-women","target_keyword":"best running shoes for women"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/slug-seo-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
{
"slug": "best-running-shoes-women",
"target_keyword": "best running shoes for women"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.slug_seo_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.
Limits
max_chars | 500 |
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. |