Coleman-Liau index calculator
Three short sentences about a cat on a mat score −2.975, about grade −3, early elementary reading. Paste English prose and see its Coleman–Liau grade with the letters and sentences per 100 words behind it. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
The Coleman–Liau index estimates the United States school grade a typical reader would need to understand a passage. Unlike syllable-based scores such as Flesch–Kincaid, this formula uses only letters, words, and sentences—counts a computer can take without a pronunciation dictionary. Paste English prose and this calculator returns the index, the two rates that feed it (letters per 100 words and sentences per 100 words), a rounded grade, and a coarse school band. Use the score as a transparent surface-complexity signal, not as a claim about rare vocabulary or topic knowledge.
What the Coleman-Liau index measures and how the formula works
Meri Coleman and T. L. Liau published this index so machines could score readability without guessing syllables from spelling. The public identity is CLI equals 0.0588 times L minus 0.296 times S minus 15.8.
L is the average number of letters per one hundred words. S is the average number of sentences per one hundred words. Letters here are alphabetic characters A through Z in either case; digits, punctuation, currency marks, and whitespace do not add to the letter count.
Words are alphabetic tokens, and a simple apostrophe contraction such as don't counts as one word rather than two fragments. Sentences are units ended by a period, question mark, or exclamation mark. If the passage has no terminal mark, the entire trimmed text is treated as one sentence so both rates stay defined.
Longer words raise L and push the grade up. More frequent sentence breaks raise S and pull the grade down. The result is already a grade-level estimate: a score near eight means roughly eighth grade, not an abstract zero-to-one-hundred ease scale.
Negative or very low scores correspond to early elementary material; scores in the mid teens sit at college level; still higher values are labelled graduate.
Input contract, counts you can audit, and validation errors
Passages that contain no alphabetic words, for example only digits or punctuation, also fail because L and S would be undefined. Extremely long inputs beyond the documented character ceiling are rejected rather than partially scored. A short early-reader passage with short words and frequent stops scores near the lower elementary grades.
Academic prose with long Latinate tokens and few full stops scores toward high school, college, or graduate bands. Failed validation is not billed. Pin the rounded fields in tests so a later wording change in the message cannot hide a real formula regression.
Where a Coleman-Liau calculator earns its keep
Editorial teams use a Coleman-Liau index calculator when a style guide already names that formula, rather than a generic readability score or a syllable-based Flesch–Kincaid grade. Plain-language programs in government, health, and finance often cite Coleman–Liau because it is cheap to recompute on every draft and does not depend on a pronunciation lexicon that would drift by dialect. Publishing workflows can gate blog drafts that spike above a chosen grade without paying per token for a generative rewrite when they only need a structural score.
Treat the heuristic as approximate for non-English text, ignore it as a measure of factual accuracy, and you get a reproducible grade signal for LMS plugins, editorial dashboards, and edge workers without standing up linguistic infrastructure of your own.
What you can do with it
Editorial grade targeting
Paste a draft and confirm the Coleman-Liau index sits near the year group your style guide names before you publish or print.
Plain-language policy checks
Score public notices and help articles so teams can flag drafts that climb above an allowed middle-school or high-school band.
FAQ
How is the Coleman-Liau index calculated?
The result is an approximate U.S. grade level.
How is Coleman-Liau different from Flesch-Kincaid or Gunning Fog?
Coleman-Liau never counts syllables. It uses letters, words, and sentences only, which is why computers can score it without a pronunciation dictionary. Flesch-Kincaid and Gunning Fog depend on syllable or complex-word heuristics and answer a different search.
Is the grade exact for every reader?
No. It is an approximate structural estimate from letter and sentence rates. It does not model rare vocabulary, background knowledge, or non-English morphology. Use it as a transparent signal alongside human review.
What does a negative Coleman–Liau score mean?
It means very easy text, at early elementary level. Three short sentences about a cat on a mat score −2.975, about grade −3, because their words are short and full stops come often.
How do I lower the grade of my text?
Use shorter words and break long sentences up. Longer words raise the letters per 100 words and push the grade up, while more frequent sentence ends raise the sentences per 100 words and pull it down.
Related tools
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/str/coleman-liau \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"The cat sat on the mat. It was a sunny day. Birds sang in the trees."}'const res = await fetch("https://api.kit.forhosting.com/str/coleman-liau", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "The cat sat on the mat. It was a sunny day. Birds sang in the trees."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/coleman-liau",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "The cat sat on the mat. It was a sunny day. Birds sang in the trees."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/coleman-liau", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"The cat sat on the mat. It was a sunny day. Birds sang in the trees."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"The cat sat on the mat. It was a sunny day. Birds sang in the trees."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/coleman-liau", 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 cat sat on the mat. It was a sunny day. Birds sang in the trees."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.coleman_liau",
"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. |
Technical notes
Empty text and strings with no alphabetic words fail with invalid_input and are not billed.
Input contract, counts you can audit, and validation errors
POST a JSON body with one required string field named text: the English passage to score. Aliases passage, content, body, and input_text are accepted when wiring older forms. The value must be a non-empty string after trimming whitespace; objects, arrays, and empty strings fail with invalid_input naming the text field. On success the body includes letter_count, word_count, and sentence_count so you can audit the three ingredients; letters_per_100_words and sentences_per_100_words as L and S rounded for stable clients; coleman_liau_index as the rounded continuous score; grade_level equal to that index; grade_level_rounded as the nearest integer grade; grade_band as a snake_case school stage such as elementary, middle_school, high_school, college, or graduate; formula and method strings documenting the identity; and a short human-readable message summarizing L, S, and the estimated grade.
Where a Coleman-Liau calculator earns its keep
Classroom materials groups check that a worksheet sits near the intended year group before print, then store letter_count, word_count, and sentence_count beside the index so a reviewer can see why the grade moved. Pair it with a multi-metric readability dashboard or a syllable-based grade estimator when those are the terms people actually search; keep this endpoint when the product question is specifically Coleman–Liau from letters, words, and sentences.
Integration use cases
CMS and pipeline automation
Call the API from a content pipeline to tag posts with coleman_liau_index and grade_band without running a generative model.
Technical questions
What input does the Coleman-Liau calculator need?
Send a non-empty English string in the text field (aliases: passage, content, body, input_text). Empty strings and text with no alphabetic words fail with invalid_input and are not billed.
What does the Coleman-Liau index calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.