Flat Bump Grade Curve Calculator
Apply a transparent grade curve when the policy combines a fixed point increase with a guaranteed minimum.
Run — free
Enter the original grade, the flat bump, the minimum floor, and the maximum allowed grade. The calculator adds the bump, compares that result with the floor, chooses the higher value, and caps it at the maximum. It also identifies which rule determined the result, making the calculation easy to explain, reproduce, and audit for one student or an automated grade-processing workflow.
Enter the grading policy as four separate values
Start with the raw grade exactly as it appears before this curve is applied. Then enter the flat bump amount, which is the same number of grade points offered to every grade processed under the policy. The minimum floor is the lowest result that the policy guarantees, while the maximum grade is the highest result it permits. Keeping these values separate prevents a common source of confusion: a five-point bump and a floor of seventy are not interchangeable rules. A raw grade of sixty receives the bump first, but the resulting sixty-five is still below the floor, so the floor controls. A raw grade of eighty receives the same bump and normally remains above the floor, so the flat bump controls. All four inputs must be finite, nonnegative numbers. The raw grade and floor cannot exceed the stated maximum because those combinations describe a contradictory grading scale rather than a curve that can be applied consistently. Decimal values are accepted when the course records fractional points or percentages.
Follow the order of operations in the result
The calculation follows a fixed sequence. First, it adds the bump amount to the raw grade and reports that intermediate value as the bumped grade. Second, it compares the bumped grade with the minimum floor and keeps whichever is higher. Third, it compares that chosen value with the maximum grade and caps the result when necessary. In compact form, the final grade is the minimum of the maximum grade and the greater of the bumped grade or floor. The response reports the final curved grade, the total increase from the raw grade, and an applied rule label. A minimum_floor label means the ordinary bump did not reach the guaranteed floor. A flat_bump label means the bumped value was valid without help from either boundary. A maximum_cap label means the bump would have crossed the allowed ceiling. This ordering matters: capping before applying the floor could create a result above the maximum when the floor is misconfigured, while adding the bump after applying the floor would grant a larger increase than the stated policy promises.
Use the calculation consistently and document its limits
For an individual check, compare the returned raw grade, intermediate bumped grade, and final curved grade with the written course policy. For batch work, send one request per grade and retain the applied rule alongside the final value; that makes it possible to distinguish students helped by the floor from those receiving only the ordinary bump. Identical inputs always return identical outputs because the calculation uses no network access, random choice, or current time. The tool does not decide whether a curve is fair, authorized, or compatible with an institution's grading rules. It also does not convert letter grades, weight assignments, round to a school-specific number of decimal places, or modify a gradebook. Those decisions should be settled before using the result. If another policy says to add the bump only below a threshold, preserve relative rankings, or rescale an entire class distribution, this calculator is not the appropriate model. Use it only when every included grade is governed by the same flat bump, minimum floor, and maximum. API automation is available for $0.002 per request.
What you can do with it
Check one adjusted grade
Show how a raw score changes under a stated bump, guaranteed floor, and maximum.
Apply a uniform course policy
Process grades individually with the same deterministic rule and retain the controlling rule for review.
Audit gradebook adjustments
Compare raw, bumped, and final values to verify that no result falls below the floor or above the maximum.
FAQ
What formula does the calculator use?
It calculates min(maximum_grade, max(raw_grade + bump_amount, minimum_floor)).
Is the bump added on top of the minimum floor?
No. The bumped grade and the floor are compared, and the higher of those two values is used before applying the maximum.
What happens when the bumped grade exceeds the maximum?
The final curved grade is limited to maximum_grade and the applied rule is maximum_cap.
Can the inputs contain decimal grades?
Yes. Any finite, nonnegative numeric values are accepted when the raw grade and floor do not exceed the maximum.
How much does an API request cost?
Each API request costs $0.002.
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/flat-bump-curve \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"raw_grade":67,"bump_amount":5,"minimum_floor":75,"maximum_grade":100}'const res = await fetch("https://api.kit.forhosting.com/edu/flat-bump-curve", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"raw_grade": 67,
"bump_amount": 5,
"minimum_floor": 75,
"maximum_grade": 100
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/flat-bump-curve",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"raw_grade": 67,
"bump_amount": 5,
"minimum_floor": 75,
"maximum_grade": 100
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/flat-bump-curve", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"raw_grade":67,"bump_amount":5,"minimum_floor":75,"maximum_grade":100}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"raw_grade":67,"bump_amount":5,"minimum_floor":75,"maximum_grade":100}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/flat-bump-curve", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"raw_grade": 67,
"bump_amount": 5,
"minimum_floor": 75,
"maximum_grade": 100
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.flat_bump_curve",
"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. |