Check password patterns
A password can look complicated while still following a pattern that password-guessing tools try early.
Run — free
This checker identifies several especially common shortcuts: walks across neighboring keyboard keys, repeated characters or text blocks, and familiar words disguised with substitutions such as zero for the letter o. It performs a deterministic local pattern analysis and explicitly does not contact a real breach database. The result explains each detected pattern without presenting the check as proof that an undetected password is secure.
Understand what the common-pattern check covers
This checker focuses on three families of choices that people use when they want a password to be memorable but visually busy. A keyboard walk follows consecutive keys, such as a run along the number row or a QWERTY letter row. Repetition includes one character typed at least three times and multi-character blocks copied immediately after themselves. The dictionary check converts familiar substitutions back to letters, removes separators, and looks for a small built-in set of words that attackers commonly prioritize. For example, exchanging an at sign for an a or a zero for an o does not make a familiar word unpredictable. The output names the category and matched fragment so an application can offer specific guidance instead of displaying a vague rejection. Matching one category produces a medium pattern risk; matching two or more produces a high pattern risk. That label describes only these supported patterns, not the password's complete security posture or mathematical strength.
Interpret a clean result with the right caution
A low result means that none of the patterns implemented by this checker appeared. It does not mean the password is strong, unique, private, or absent from historical leaks. The capability deliberately avoids live and downloaded breach databases, so `breach_database_checked` is always false. It also does not estimate entropy, model an attacker's full ruleset, inspect reuse across accounts, or evaluate the system that stores the password. A short name, an uncommon dictionary word, a date, or a personal reference may escape these fixed tests and remain easy to guess. Treat the result as one focused signal in a layered password policy. Favor long, randomly generated credentials or genuinely unrelated passphrases, prevent reuse where possible, add rate limiting and multifactor authentication, and store credentials with a modern password-hashing function. The recommendation returned for a clean result reinforces this boundary instead of awarding a misleading security certificate. This conservative interpretation helps teams use the checker as a precise diagnostic rather than an all-purpose strength meter.
Use the result for clear and privacy-conscious feedback
The response is structured for signup forms, password-change screens, security training, and local policy tooling. `common_pattern_detected` provides a simple branch for user-interface logic, while `patterns` supplies the category, matched fragment, and a short explanation. An interface can therefore say that a keyboard sequence was found or that substitutions still reveal a common word. Avoid logging the input, the match fragments, or the complete response in production analytics because even partial password material is sensitive. Run the free browser version when a user needs immediate local feedback, or call the API for $0.002 per request when integrating the deterministic rule set into an application. An empty password is an input error rather than a low-risk result, which prevents missing form values from being mistaken for safe credentials. Because the algorithm uses fixed tables with no network, randomness, clock, or shared state, identical inputs produce identical outputs. That stability makes policy behavior testable while the explicit breach-check flag keeps product copy honest.
What you can do with it
Explain a signup rejection
Show whether a candidate contains a keyboard walk, repetition, or an easily reversed substitution instead of returning an unexplained policy failure.
Review password-policy examples
Test sample credentials used in internal guidance and remove examples that only look complex because of predictable symbols and digits.
Add focused local feedback
Run the same deterministic checks in a browser without sending the candidate to a breach service or claiming that no historical match exists.
FAQ
Does this query a real password breach database?
No. The algorithm uses fixed local pattern rules only, and every response states that a breach database was not checked.
What keyboard patterns are detected?
It detects runs of at least four consecutive keys in either direction on the QWERTY number row and the three main letter rows.
Which kinds of repetition are flagged?
It flags a character repeated at least three times and immediately repeated text blocks from two through eight characters long.
Does a low result prove that my password is strong?
No. It only means the implemented pattern families were not detected; it does not measure entropy, uniqueness, personal guessability, or breach exposure.
What happens when the password is empty?
The request fails with an invalid-input error so a missing value cannot be interpreted as a clean result.
How much does the API check cost?
Each successful API request costs $0.002. The browser version can run locally without a breach-service call.
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/security/password-breach-pattern-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"password":"P@ssw0rd123"}'const res = await fetch("https://api.kit.forhosting.com/security/password-breach-pattern-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"password": "P@ssw0rd123"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/security/password-breach-pattern-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"password": "P@ssw0rd123"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/security/password-breach-pattern-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"password":"P@ssw0rd123"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"password":"P@ssw0rd123"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/security/password-breach-pattern-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
{
"password": "P@ssw0rd123"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "security.password_breach_pattern_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. |