Text grade level from length
Three short sentences with 16 words and 17 syllables score below first grade, at an early elementary level. Paste an English passage and see its approximate school grade, worked out from sentence length and syllables per word. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Writers, teachers, and curriculum designers often need a quick answer to a simple question: roughly which school grade could read this passage without heavy struggle? This reading grade level estimator accepts an English text passage, counts sentences, words, and syllables with a fixed heuristic, and returns an approximate U.S. grade level based on average sentence length and average syllables per word—the same structural ingredients used by the classic Flesch–Kincaid Grade Level formula. Use the score as a transparent length-and-complexity signal, not as a claim about vocabulary rarity or topic difficulty.
How grade level is derived from length heuristics
School grade level here is not a subjective editorial judgment and not a machine-learning classifier. It is a closed-form estimate from two surface statistics that correlate with reading demand in English prose: how long sentences tend to be, and how many syllable nuclei each word tends to carry. Average sentence length (ASL) is the number of alphabetic word tokens divided by the number of sentence units.
Sentence units are produced by splitting on terminal punctuation such as period, question mark, and exclamation mark; if the passage has no terminal mark, the entire trimmed text counts as one sentence so the ratio stays defined. Average syllables per word (ASW) is total syllables divided by word count. Syllables are estimated with a deterministic English vowel-group heuristic: consecutive vowels form one nucleus, a trailing silent e is usually dropped for longer words, and every alphabetic token contributes at least one syllable.
The grade formula is the public Flesch–Kincaid Grade Level identity: zero point three nine times ASL plus eleven point eight times ASW minus fifteen point five nine. Longer sentences and more multi-syllable words push the score upward; short clauses and mono-syllabic diction pull it toward early elementary bands.
The response also clamps the continuous score into a practical display range and maps it to a coarse band label such as elementary, middle school, high school, or college so interfaces can show a plain-language label next to the numeric grade without inventing their own thresholds.
What you can do with it
Classroom and worksheet alignment
Paste draft passages and check that estimated grade level stays near the target school year before printing handouts.
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
Is the grade level exact for every reader?
No. It is an approximate structural estimate from length heuristics. It does not model rare vocabulary, background knowledge, or non-English morphology. Use it as a transparent signal alongside human review.
How does this differ from a full readability score suite?
This capability focuses on approximate school grade level from ASL and ASW. Multi-metric readability tools may also return ease scores or competing indices; search intent here is grade-from-length for education and plain-language workflows.
Which formula does the estimate use?
The Flesch–Kincaid Grade Level: 0.39 times the average words per sentence, plus 11.8 times the average syllables per word, minus 15.59. Longer sentences and longer words raise the grade.
Why did my text get a negative grade?
Very short sentences made of one-syllable words push the result below zero. The sample about a cat, a sunny day and singing birds scores -0.9725, which simply means early elementary.
Can I check a text that is not in English?
It is built for English prose. Syllables are counted with English vowel-group rules and the formula was designed for English, so it is meant for English passages only.
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/edu/reading-level-grade \
-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/edu/reading-level-grade", {
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/edu/reading-level-grade",
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/edu/reading-level-grade", 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/edu/reading-level-grade", 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": "edu.reading_level_grade",
"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
The free browser path and the paid API share one pure analytic module, so homework checks, LMS plugins, and editorial dashboards never disagree on the same input. Empty text and strings with no alphabetic words fail with invalid_input and are not billed.
Input contract, response fields, and validation errors
Passages that contain no alphabetic words (for example only digits or punctuation) also fail because both ASL and ASW would be undefined or meaningless. Extremely long inputs beyond the documented character ceiling are rejected rather than partially scored. Example: a short early-reader style passage with short sentences and mostly one-syllable words scores near the lower elementary grades, while academic prose with long nested clauses and multi-syllable terms scores toward high school or college. Failed validation is not billed. 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 by the solver for convenience when wiring older forms. The value must be a non-empty string after trimming whitespace; pure numbers, objects, and empty strings fail with invalid_input naming the text field. On success the body includes word_count, sentence_count, and syllable_count so you can audit the intermediate totals; avg_sentence_length and avg_syllables_per_word rounded for stable clients; grade_level as the rounded Flesch–Kincaid continuous score; grade_level_clamped within a fixed educational display range; grade_band as a snake_case school stage; formula and method strings documenting the identity; and a short human-readable message summarizing ASL, ASW, and the estimated grade.
Where a grade-from-length API earns its keep
Classroom materials teams use a reading grade level calculator to keep worksheets aligned with target year groups before print. Accessibility and plain-language programs track whether public notices drift above the grade band their policy allows, without paying per token for a generative rewrite model when they only need a structural score. Publishing workflows gate blog drafts that spike above a chosen grade threshold and leave stylistic rewrite to human editors or a separate CEFR rewrite capability when full paraphrasing is required. Pair it with reading-time estimates or multi-metric readability dashboards when you need duration or competing indices; keep this endpoint when the product question is specifically approximate school grade from sentence length and syllable density.
Integration use cases
CMS and editorial automation
Call the API from a content pipeline to tag posts with grade_level and grade_band without running a generative model.
Technical questions
How is reading grade level calculated from the text?
The API counts words, sentences, and syllables, then applies grade = 0.39×(words/sentences) + 11.8×(syllables/words) − 15.59, the Flesch–Kincaid Grade Level formula based on average sentence length and average syllables per word.
What input does the text grade level 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 reading grade level estimator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.