Current Grade Percentage Calculator
A current grade percentage answers a specific question: how well are you doing on the work that has actually been graded?
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Enter the points earned and points possible for each assignment, then mark work without a posted score as ungraded. The calculator excludes those pending assignments from both totals, adds the graded points, and reports the percentage earned so far. This gives you a clear snapshot of your standing today without treating unfinished or unreturned work as a zero.
Enter points from the gradebook accurately
Start with the assignments visible in your course gradebook and copy the earned points and possible points for each one. A quiz scored 18 out of 20 should be entered as 18 earned and 20 possible. Keep assignments as separate rows so you can verify the inputs against the source later. Mark an assignment as graded only when an instructor has posted a real score. If a project is listed with 100 possible points but has no score yet, leave it marked ungraded; the calculator will ignore it. Do not enter a placeholder zero unless zero is the actual recorded grade. A genuine zero belongs in the calculation because the work was graded, while a blank or pending score does not. This distinction prevents future work from lowering today’s percentage. Names are optional, but labels such as “Quiz 1” or “Research paper” make a longer list easier to review and help you catch duplicate or omitted rows before relying on the result.
Understand the points-based calculation
The calculator adds all earned points from graded rows, adds the possible points from those same rows, divides the earned total by the possible total, and multiplies by 100. For example, scores of 18 out of 20 and 42 out of 50 produce 60 earned points out of 70 possible points, or 85.71 percent when rounded to two decimal places. Any row marked ungraded is excluded from both sides of the fraction. That exclusion matters: including the denominator for pending work while adding no earned points would incorrectly treat the work as a zero. The result is a points-based current grade, not necessarily the official course grade. Some courses weight categories such as exams, homework, and participation separately, apply dropped-score rules, award extra credit, or use unpublished adjustments. If your syllabus uses category weights, this simple points-total method may differ from the learning management system. Use the displayed totals to confirm exactly which graded points contributed to the percentage.
Use the result as a present-day snapshot
Treat the calculated percentage as a snapshot rather than a prediction of your final grade. It tells you where the graded evidence places you today, but the result can move substantially when a large exam or project is returned. Compare the earned and possible totals with your gradebook, and investigate any mismatch before making decisions. You can rerun the calculation whenever a new score appears, correct an input, or test whether an apparent blank is actually recorded as a zero. The graded and ungraded counts also provide a quick completeness check: an unexpectedly high ungraded count may mean that you marked a posted score incorrectly. For planning, pair this result with the course syllabus and the remaining assignment weights rather than assuming the current percentage will remain unchanged. The calculation is deterministic, uses no network request or random value, and gives the same result for the same inputs. Browser use is free, while an API request is priced at $0.002.
What you can do with it
Check today’s standing
Combine every posted score while leaving assignments that have not been returned out of the calculation.
Audit a gradebook total
Compare the calculator’s earned and possible point totals with the totals shown by a course system.
Update after a new score
Mark a previously pending assignment as graded and immediately recalculate the current percentage.
FAQ
What does the calculator ignore?
It ignores every assignment marked ungraded, excluding both its earned points and possible points.
Should a missing assignment be entered as zero?
Only if zero is an actual posted grade. Keep work that has not yet been graded marked ungraded.
Does this support weighted grade categories?
No. It calculates a points-based percentage from the graded assignments supplied, so category weighting may make an official course grade different.
Can earned points exceed possible points?
Yes. The calculator permits that situation because instructors may award bonus or extra-credit points on a graded assignment.
How is the percentage calculated?
Graded earned points are divided by graded possible points and multiplied by 100, then rounded to the selected number of decimals.
What does an API request cost?
The base price is $0.002 per request. The same deterministic calculation can run free in the browser.
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/current-grade-percentage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"assignments":[{"name":"Quiz 1","earned":18,"possible":20,"graded":true},{"name":"Essay","earned":42,"possible":50,"graded":true},{"name":"Final project","possible":100,"graded":false}]}'const res = await fetch("https://api.kit.forhosting.com/edu/current-grade-percentage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"assignments": [
{
"name": "Quiz 1",
"earned": 18,
"possible": 20,
"graded": true
},
{
"name": "Essay",
"earned": 42,
"possible": 50,
"graded": true
},
{
"name": "Final project",
"possible": 100,
"graded": false
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/current-grade-percentage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"assignments": [
{
"name": "Quiz 1",
"earned": 18,
"possible": 20,
"graded": true
},
{
"name": "Essay",
"earned": 42,
"possible": 50,
"graded": true
},
{
"name": "Final project",
"possible": 100,
"graded": false
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/current-grade-percentage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"assignments":[{"name":"Quiz 1","earned":18,"possible":20,"graded":true},{"name":"Essay","earned":42,"possible":50,"graded":true},{"name":"Final project","possible":100,"graded":false}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"assignments":[{"name":"Quiz 1","earned":18,"possible":20,"graded":true},{"name":"Essay","earned":42,"possible":50,"graded":true},{"name":"Final project","possible":100,"graded":false}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/current-grade-percentage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"assignments": [
{
"name": "Quiz 1",
"earned": 18,
"possible": 20,
"graded": true
},
{
"name": "Essay",
"earned": 42,
"possible": 50,
"graded": true
},
{
"name": "Final project",
"possible": 100,
"graded": false
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.current_grade_percentage",
"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. |