Compute text readability score
This readability score calculator turns English text into two familiar measurements: Flesch Reading Ease and Flesch-Kincaid grade level.
Run — free
It also reports the sentence, word, and estimated syllable counts behind those results, making every score inspectable instead of mysterious. Use it to compare drafts, check whether instructions suit an intended audience, or add a consistent readability threshold to an editorial workflow. The calculation is deterministic, fast, and performed without a language model or external service.
Understand what the two scores mean
Flesch Reading Ease and Flesch-Kincaid grade level describe the same basic properties from different perspectives. Reading Ease generally rises when sentences become shorter and words contain fewer syllables. A higher ease result therefore suggests that the sample is simpler to read, while a lower result suggests denser prose. Grade level transforms similar evidence into an approximate United States school grade. A result near eight, for example, suggests that the wording resembles material commonly accessible around eighth grade. Neither number measures whether a claim is correct, whether the writing is engaging, or whether specialist vocabulary is appropriate. They are mechanical signals based on sentence length and estimated word complexity. Treat them as comparison tools, not verdicts about quality. They work especially well when you score several versions of the same message, because a change in the result can reveal that editing made the copy materially simpler or denser. Always interpret the numbers alongside audience knowledge, document purpose, and any terminology that readers genuinely need.
See exactly how the calculation works
The calculator first identifies sentences that end with a period, question mark, or exclamation mark. It then extracts English words and estimates syllables from groups of vowels, with adjustments for common silent endings. From those counts it computes average words per sentence and average syllables per word. Flesch Reading Ease uses the formula 206.835 minus 1.015 times words per sentence minus 84.6 times syllables per word. Flesch-Kincaid grade level uses 0.39 times words per sentence plus 11.8 times syllables per word minus 15.59. Results are rounded to two decimal places, while the underlying sentence, word, and syllable totals remain integers. Syllable counting without a pronunciation dictionary is necessarily an estimate: names, abbreviations, loanwords, and irregular English spellings can differ from spoken pronunciation. That limitation is predictable and applies consistently to every request. For useful comparisons, keep punctuation complete and score samples of similar size and genre. If the input contains no detectable completed sentence, the calculator returns an input error instead of inventing a sentence count and presenting a misleading score.
Use readability scores in real editorial work
Begin with a clear target based on real readers rather than chasing the highest possible Reading Ease value. Product instructions for a broad public audience may benefit from short sentences and familiar words, while a professional standard or scientific abstract may legitimately score as difficult. Paste or submit the complete passage, record both scores, and review the reported counts. Long sentences often offer the quickest editing opportunity: split independent ideas, replace stacked clauses, and move qualifications into a separate sentence. If syllables per word remain high, look for abstract nouns or formal phrases that have accurate shorter alternatives. Recalculate after each meaningful revision and compare the change, but read the text aloud as well. Automated teams can run the same check before publication, flag content outside an agreed range, and send it to an editor rather than automatically rejecting it. Each API request costs $0.002. Because the algorithm is deterministic and uses no network service, identical input produces identical output. This consistency makes it suitable for tests, content pipelines, quality dashboards, and version-to-version audits where unexplained score drift would be undesirable.
What you can do with it
Review public instructions
Check whether forms, help articles, and service notices use sentence and word complexity appropriate for a broad audience.
Compare content revisions
Measure an original draft and an edited version with the same formulas to confirm whether simplification changed readability.
Add an editorial quality signal
Run deterministic scoring in a publishing pipeline and flag passages outside an audience-specific range for human review.
FAQ
What results does the calculator return?
It returns sentence, word, and estimated syllable counts together with Flesch Reading Ease and Flesch-Kincaid grade level, rounded to two decimal places.
What does a higher Reading Ease score mean?
A higher score generally indicates shorter sentences and words with fewer estimated syllables, which tend to make English prose easier to read.
Are syllable counts exact?
No. They are deterministic spelling-based estimates. Irregular pronunciations, names, abbreviations, and loanwords may differ from dictionary counts.
Why does text without punctuation return an error?
The formulas require a sentence count. Without a sentence ending in a period, question mark, or exclamation mark, the calculator refuses to invent that value.
How much does an API request cost?
Each API request costs $0.002. The calculation is deterministic and does not call 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/text/readability-score \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"The sun is warm. Birds sing in the trees."}'const res = await fetch("https://api.kit.forhosting.com/text/readability-score", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "The sun is warm. Birds sing in the trees."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/readability-score",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "The sun is warm. Birds sing in the trees."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/readability-score", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"The sun is warm. Birds sing in the trees."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"The sun is warm. Birds sing in the trees."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/readability-score", 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": "The sun is warm. Birds sing in the trees."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.readability_score",
"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_tokens | 20000 |
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. |