Rubric weighted score calculator
This rubric weighted score calculator combines per-criterion percentage scores using the exact weights defined by a grading rubric.
Run — free
It checks that every score and weight is valid, refuses to calculate when the weights do not add up to 100%, and returns both the weighted total and a conventional A–F letter grade. Each criterion's weighted contribution is included, making the result easy to audit, explain to a learner, or pass into a grading workflow without relying on a spreadsheet formula.
Prepare criterion scores and weights
Enter one record for every criterion in the rubric. Each record needs a clear name, a score expressed as a percentage from 0 to 100, and a weight expressed as a percentage from 0 to 100. For example, a research criterion scored at 92 and worth 30% of the assignment uses a score of 92 and a weight of 30. Convert point-based criteria to percentages before submitting them: 18 points earned out of 20 possible becomes a score of 90. Keep every rubric row in the input, including a zero-weight row when it remains useful for feedback but should not affect the grade. The criterion names appear in the result alongside their original values and weighted contributions, so specific, stable labels make later review easier. The calculator accepts up to 100 criteria, which covers detailed analytic rubrics without encouraging unbounded payloads. It rejects blank names, nonnumeric values, infinities, and values outside the permitted range rather than guessing what the author meant.
Understand the weighted calculation
For each criterion, the calculator multiplies its percentage score by its percentage weight and divides by 100. A score of 80 on a criterion worth 25% therefore contributes 20 weighted points. It then adds all contributions to produce the total score. Before returning anything, it verifies that the submitted weights sum to 100%. This check matters because an incomplete set of weights can still yield a number that looks credible while understating or overstating the actual grade. Small floating-point representation differences are tolerated, but a genuinely incomplete or excessive total is returned as an invalid input error; weights are never silently rescaled. Contributions and the total are rounded to two decimal places for a stable, readable result. The letter grade uses familiar thresholds applied to that displayed total: A for 90 or above, B for 80 through 89.99, C for 70 through 79.99, D for 60 through 69.99, and F below 60. This fixed scale makes the output predictable and should be confirmed against the grading policy in use.
Use and review the result
The response provides the total score, letter grade, confirmed weight total, and an ordered list of criteria with each weighted contribution. That detail supports more than a final mark. An instructor can show how different rubric dimensions affected the outcome, a course system can store the calculation beside the original assessment, and a quality reviewer can reproduce the total without reconstructing formulas from a spreadsheet. Because the algorithm is deterministic and uses no network service, the same valid input always produces the same JSON result in the browser and through the API. Treat the letter as a convenience based on the stated A–F boundaries, not as a replacement for an institution's grading policy. If a course uses plus and minus grades, pass/fail rules, curved grades, criterion-specific point maxima, dropped criteria, or special rounding rules, perform those policy steps separately. When a weight error occurs, correct the rubric definition or include the missing criteria rather than changing scores to force the weights to 100. This preserves the distinction between academic performance and the structure used to evaluate it.
What you can do with it
Finalize an assignment grade
Combine research, analysis, accuracy, and presentation percentages according to the approved rubric and retain the contribution breakdown.
Validate a learning management workflow
Reject malformed rubric data before a weighted score is written to a gradebook or student record.
Explain grading decisions
Show learners and reviewers exactly how each criterion contributed to the final percentage and letter grade.
FAQ
How much does a request cost?
Each API request costs $0.002. The calculator also runs in the browser for tier-A use.
What happens if the weights do not total 100%?
The request returns an invalid input error. The calculator does not silently normalize incomplete or excessive weights.
Which letter-grade scale is used?
The scale is A at 90 or above, B at 80 or above, C at 70 or above, D at 60 or above, and F below 60.
Can criteria use points instead of percentages?
Not directly. Convert each earned score to a percentage of that criterion's possible points before submitting it.
Are zero-weight criteria allowed?
Yes. A zero-weight criterion is returned in the breakdown but contributes zero points to the total.
How is rounding handled?
Each displayed weighted contribution and the final score are rounded to two decimal places. The letter grade is assigned from the rounded final score.
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/rubric-score-aggregate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"criteria":[{"name":"Research","score":92,"weight":30},{"name":"Analysis","score":84,"weight":45},{"name":"Presentation","score":96,"weight":25}]}'const res = await fetch("https://api.kit.forhosting.com/edu/rubric-score-aggregate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"criteria": [
{
"name": "Research",
"score": 92,
"weight": 30
},
{
"name": "Analysis",
"score": 84,
"weight": 45
},
{
"name": "Presentation",
"score": 96,
"weight": 25
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/rubric-score-aggregate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"criteria": [
{
"name": "Research",
"score": 92,
"weight": 30
},
{
"name": "Analysis",
"score": 84,
"weight": 45
},
{
"name": "Presentation",
"score": 96,
"weight": 25
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/rubric-score-aggregate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"criteria":[{"name":"Research","score":92,"weight":30},{"name":"Analysis","score":84,"weight":45},{"name":"Presentation","score":96,"weight":25}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"criteria":[{"name":"Research","score":92,"weight":30},{"name":"Analysis","score":84,"weight":45},{"name":"Presentation","score":96,"weight":25}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/rubric-score-aggregate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"criteria": [
{
"name": "Research",
"score": 92,
"weight": 30
},
{
"name": "Analysis",
"score": 84,
"weight": 45
},
{
"name": "Presentation",
"score": 96,
"weight": 25
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.rubric_score_aggregate",
"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. |