Rubric Weighted Score Calculator
A weighted rubric turns several criterion results into one assignment score while preserving the importance assigned to each part of the work.
Run — free
This calculator multiplies every criterion level by its weight, adds those contributions, and shows the arithmetic behind the total. Enter decimal weights such as 0.40 for 40 percent when you want the final result to stay on the same scale as the criterion levels. The response also reports total weight and a weighted average, making incomplete or unusually scaled rubrics easier to identify before a grade is recorded.
Set up criterion levels and weights consistently
Begin with one row for every criterion in the assignment rubric. Give each row a clear name, enter the level or points earned, and enter the multiplier that represents its importance. If Research is worth 40 percent, use a weight of 0.40 rather than 40 when you want a result on the original level scale. A common rubric might assign 0.40 to Research, 0.35 to Reasoning, and 0.25 to Writing; those weights total 1, so the weighted sum is directly comparable with the levels. The calculator also accepts weights that do not total 1 because some instructors use point multipliers or are scoring an incomplete section of a larger rubric. In that case, review both total_weight and weighted_average instead of assuming the raw sum is already normalized. Levels and weights must be non-negative finite numbers, and at least one weight must be greater than zero. Keeping all levels on the same scale is essential: mixing a four-point level with a percentage score produces valid arithmetic but usually does not express the intended grading policy.
Understand the weighted score calculation
For each row, the calculator applies the direct formula weighted score equals level multiplied by weight. It then adds every row's product to produce total_weighted_score. For example, a level of 4 with a weight of 0.40 contributes 1.60, while a level of 3 with a weight of 0.35 contributes 1.05. The contributions array preserves these intermediate values so a student, instructor, or reviewer can reproduce the result without trusting an unexplained total. The reported weighted_average divides the unrounded sum of products by the unrounded sum of weights. When weights total 1, the weighted average and total weighted score are the same. When weights total 100, the average restores the criterion scale while the raw total retains the literal products requested. Rounding happens only for displayed output and uses the selected precision from zero through ten decimal places. The calculation itself accumulates the original numeric inputs first, avoiding the drift that would occur if every displayed contribution were rounded before summation.
Check the result before assigning a grade
Use the output as an auditable calculation, not as a substitute for the rubric's grading rules. First compare criteria_count with the number of rows in the assignment rubric. Next inspect total_weight: a value of 1 is typical for decimal proportions, while 100 is typical when whole percentages were intentionally used. Then scan contributions to confirm that the most important criteria have the largest multipliers and that each level was entered on the intended scale. The calculator does not infer missing criteria, maximum levels, letter-grade thresholds, late penalties, extra credit, or pass requirements. Apply those policies separately unless they are explicitly represented as criterion rows. This separation keeps the result deterministic and makes disagreements easier to resolve: every returned contribution corresponds to exactly one submitted row. For automated grading workflows, store the original rubric input beside the response so future reviewers can see both the policy values and the computed total. The API costs $0.002 per request, and the same pure calculation can run in the browser without sending rubric data to a third-party scoring service.
What you can do with it
Calculate an assignment grade
Combine performance levels for research, reasoning, presentation, and mechanics according to the published rubric weights.
Audit a grading spreadsheet
Compare transparent per-criterion contributions with a spreadsheet total to find a mistyped weight or formula.
Preview rubric revisions
Test how changing criterion weights affects the total before publishing a new assessment rubric.
FAQ
What formula does the calculator use?
It multiplies each criterion level by its weight and sums all products. It also divides that sum by total weight to report a weighted average.
Should I enter 30 or 0.30 for a 30 percent weight?
Use 0.30 when you want the weighted total to remain on the criterion level scale. You may use 30, but the raw total will be scaled by 100; weighted_average still normalizes it.
Do weights have to add up to 1?
No. The response reports total_weight so you can detect a partial or differently scaled rubric, and weighted_average normalizes any positive total weight.
Can criteria have different maximum levels?
The arithmetic accepts any non-negative levels, but it does not normalize different maximums. Convert levels to a common scale before calculating if the rubric requires that treatment.
How much does the API calculation cost?
Each API request costs $0.002. The browser version can perform the same deterministic calculation locally.
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-weighted-score \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"criteria":[{"name":"Research","level":4,"weight":0.4},{"name":"Reasoning","level":3,"weight":0.35},{"name":"Writing","level":5,"weight":0.25}]}'const res = await fetch("https://api.kit.forhosting.com/edu/rubric-weighted-score", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"criteria": [
{
"name": "Research",
"level": 4,
"weight": 0.4
},
{
"name": "Reasoning",
"level": 3,
"weight": 0.35
},
{
"name": "Writing",
"level": 5,
"weight": 0.25
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/rubric-weighted-score",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"criteria": [
{
"name": "Research",
"level": 4,
"weight": 0.4
},
{
"name": "Reasoning",
"level": 3,
"weight": 0.35
},
{
"name": "Writing",
"level": 5,
"weight": 0.25
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/rubric-weighted-score", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"criteria":[{"name":"Research","level":4,"weight":0.4},{"name":"Reasoning","level":3,"weight":0.35},{"name":"Writing","level":5,"weight":0.25}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"criteria":[{"name":"Research","level":4,"weight":0.4},{"name":"Reasoning","level":3,"weight":0.35},{"name":"Writing","level":5,"weight":0.25}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/rubric-weighted-score", 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",
"level": 4,
"weight": 0.4
},
{
"name": "Reasoning",
"level": 3,
"weight": 0.35
},
{
"name": "Writing",
"level": 5,
"weight": 0.25
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.rubric_weighted_score",
"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.
Limits
max_items | 500 |
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. |