Range of grades calculator
With five grades whose highest is 91 and lowest is 68, the range is 23: the highest minus the lowest. Paste a section's marks after grading and get the spread in one step, on any scale. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Grades
- 72, 85, 91, 68, 77
- Quantity
- 5
- Highest
- 91
- Lowest
- 68
- Range
- 23
When a quiz, midterm, or final is graded, teachers and teaching assistants often need one clear number for how far student results stretched—not a full statistics suite. This range of grades calculator takes a list of grade values, finds the highest and the lowest, and returns the range as highest minus lowest so you can summarize score spread in a single deterministic response. Use it when the search intent is the spread of grades itself—parent conferences, section comparisons, or curve discussions—without computing means, medians, or letter bands you did not ask for.
What the range of grades means and how it is computed
The range of a set of grades is the simplest measure of spread used in classrooms: identify the highest value in the list, identify the lowest value, and subtract lowest from highest. That single difference answers “how wide was the distribution of results?” without requiring ordered quartiles, variance formulas, or a statistics textbook.
A small range means students performed tightly—most marks clustered near the same band—while a large range means outcomes were spread out and you may want item analysis, differentiated support, or a transparent discussion of ceiling and floor effects. This calculator deliberately stays at that teaching-facing summary: it returns the cleaned grades list, the count of entries, highest, lowest, and range, plus a short formula string and a method label for audit logs.
It does not invent a class mean, standard deviation, letter grades, or weighted category blends; those are different search intents and different tools. Grades may sit on any finite numeric scale—percent 0–100, points out of fifty, raw rubric totals—because the arithmetic of max minus min does not depend on the scale you chose. When every grade is identical, range is zero and highest equals lowest.
When the list has one grade, highest and lowest coincide and range is zero, which is correct mathematics even if it is not very informative. Duplicate marks are allowed and do not change the definition; only the extremes matter for range. Negative or above-one-hundred values are accepted when your scale uses them, so curved extras and penalty scores still compute a truthful spread.
What you can do with it
Post-exam spread for teachers
Paste the section’s grades after marking to get highest, lowest, and range for the board, LMS note, or parent conference in one step.
FAQ
How do I calculate the range of grades?
Send a non-empty grades array of finite numbers.
What is the range of a set of grades?
Range is the highest grade minus the lowest grade in your list. A larger range means greater spread of student results.
Do grades have to be between 0 and 100?
No. Any finite numbers within the supported magnitude are accepted, so percent scales, points-out-of-N exams, and raw rubric totals all work.
What if I submit an empty list of grades?
A range requires at least one finite grade; empty lists are not billed.
Does it also give me the class average?
No. It reports only the number of grades, the highest, the lowest and the range between them. The mean, the median and letter bands are different questions with their own calculators.
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/range-of-grades \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"grades":[72,85,91,68,77]}'const res = await fetch("https://api.kit.forhosting.com/edu/range-of-grades", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"grades": [
72,
85,
91,
68,
77
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/range-of-grades",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"grades": [
72,
85,
91,
68,
77
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/range-of-grades", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"grades":[72,85,91,68,77]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"grades":[72,85,91,68,77]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/range-of-grades", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"grades": [
72,
85,
91,
68,
77
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.range_of_grades",
"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
What the range of grades means and how it is computed
Empty lists are invalid: there is no range of nobody, and the API fails with invalid_input instead of returning a hollow zero that could mislead a dashboard.
Input contract, response shape, and validation rules
There is no requirement that grades lie in zero to one hundred: the tool accepts any finite magnitude within a safe bound so point-based exams and scaled rubrics work without preprocessing. Keep lists modest for classroom sections; the five-hundred ceiling is a guardrail against accidental bulk dumps, not a target for everyday use. POST a JSON object with a required grades field: a non-empty array of finite numbers, at least one entry and at most five hundred. Aliases accepted for the same list include scores, marks, values, numbers, and exam_scores so gradebook exports with different column names still map cleanly. Each element may be a JSON number or a numeric string; non-finite values, empty strings, and non-numeric tokens fail with invalid_input naming the bad index. You may also pass grades as a single comma- or whitespace-separated string when a text form is more convenient than a JSON array. On success the body echoes the cleaned grades array, count (n), highest, lowest, and range (highest minus lowest), plus a short formula string range equals highest minus lowest and method label range_of_grades for clients that log which endpoint produced the row. Missing grades, an empty array, more than five hundred entries, or a body that is not an object all raise invalid_input and are not billed. Pair this contract with your own letter-grade bands, means, or curves if you need categorical or central-tendency output; this endpoint reports descriptive grade spread only.
Where a range of grades API earns its keep
Tutoring centers and after-school programs track quiz ranges week over week with a deterministic oracle that never drifts between the free browser check and the automated report job. LMS plugins and homework portals call the same pure module to show “score spread so far” next to individual marks without shipping a statistics library to every client. When you also need the class mean in the same request, use a dedicated average tool; this landing stays focused on the max-minus-min search intent so the SEO page and the response contract stay honest about what they deliver. Department coordinators batch parallel sections through the API to compare spreads before deciding whether a common curve is fair across rooms that taught the same exam.
Integration use cases
Multi-section spread comparison
Send each parallel section’s grades through the API and compare ranges before choosing a common curve or retake policy.
LMS and tutoring dashboards
Show live grade spread next to individual marks with a deterministic parse endpoint that matches the free browser widget.
Technical questions
What does the range of grades calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.