Weighted GPA with honors calculator
An AP A counts as 5.0 and an honors B+ as 3.8: with two regular courses at A- and B, the weighted GPA is 3.88 against 3.5 unweighted. Honors adds 0.5 and AP or IB 1.0 by default. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
High schools and many colleges report both an unweighted grade point average on the classic four-point letter scale and a weighted grade point average that rewards rigor. Honors sections typically add half a point and Advanced Placement or International Baccalaureate sections add a full point, so an A in AP Calculus can count as five point zero while the same A in a regular elective still counts as four point zero. This weighted GPA with honors calculator accepts a list of courses with letter grades, credit hours, and rigor level, applies configurable honors and AP bonuses on top of the standard base points, and returns both the weighted and unweighted GPA plus a transparent per-course breakdown.
What weighted GPA means and how honors and AP bonuses work
An unweighted GPA maps every letter grade to the same fixed table regardless of how hard the course was: A equals four point zero, B equals three point zero, C equals two point zero, D equals one point zero, and F equals zero, with common plus and minus steps such as A-minus at three point seven and B-plus at three point three.
That scale is fair for comparing students who took the same menu of classes, but it understates the load of someone who filled their schedule with honors and Advanced Placement sections. Weighted GPA policies fix that by adding a level bonus before multiplying by credits. The most common United States high-school convention adds zero point five for honors and one point zero for AP or IB, so an honors A becomes four point five and an AP A becomes five point zero.
Quality points for a course are those weighted points times the course credits; the overall weighted GPA is the sum of quality points divided by the sum of credits. The unweighted GPA uses the base table only, which is why counselors almost always quote both numbers. Failing a rigorous course still earns zero quality points under this calculator: an F never receives an honors or AP boost, matching the usual school policy that a failed advanced class does not inflate the transcript.
What you enter and how the GPA is calculated
Each object needs grade, a letter from the set A, A-, B+, B, B-, C+, C, C-, D+, D, F, and credits, a finite number strictly greater than zero representing credit hours or semester units. Optional name is a short label echoed in the breakdown so humans can match rows to a schedule. Optional level is regular, honors, or ap; when omitted the course is treated as regular with zero bonus.
Optional decimals is an integer from zero to six that controls half-up rounding of GPA and quality-point fields; the default is two decimal places to match common transcript displays. The core walks the list once, looks up base points, adds the level bonus unless the grade is F, multiplies by credits, and accumulates weighted and unweighted quality-point sums.
Example: AP Calculus A for one credit, Honors English B-plus for one credit, regular Biology A-minus for one credit, and regular US History B for one credit with default bonuses yields four total credits, a weighted GPA of three point eight eight, and an unweighted GPA of three point five when decimals is two.
When a weighted GPA with honors matters
College-counseling platforms and student portals use a weighted GPA calculator so applicants can enter current grades, mark which sections are honors or AP, and see both averages before transcript freeze. Scholarship and dual-enrollment tools recompute what-if scenarios when a student considers dropping an AP class or when a district changes its honors bonus from half a point to a full point. Failed validation does not consume balance.
Keep course lists short, pin the rounded GPA fields in tests, and you get reproducible transcript math for homework checkers, LMS plugins, and edge workers without standing up a full student-information system. The capability is intentionally narrow: it computes weighted and unweighted GPA with configurable level bonuses and a per-course breakdown; it does not apply class-rank curves, drop the lowest semester, or invent district policies beyond the numbers you supply.
What you can do with it
College application transcript check
Students mark each course as regular, honors, or AP and compare weighted versus unweighted GPA before submitting applications.
Counselor bulk recompute
Guidance offices recompute both GPAs from grade exports with district honors and AP bonuses to catch level or credit typos.
Scholarship and what-if scenarios
Portals recalculate the effect of adding or dropping an AP section when awards or dual enrollment depend on weighted GPA.
FAQ
How is the weighted GPA calculated?
Each letter grade maps to base points on the 4.0 scale. Weighted GPA is the credit-weighted mean of those points: sum((base + bonus) × credits) / sum(credits).
What is the difference between weighted and unweighted GPA?
Unweighted GPA uses only the base letter table. Weighted GPA adds the honors or AP level bonus before multiplying by credits, so rigorous courses raise the average more than the same grade in a regular section.
Can I change the honors or AP bonus amounts?
Defaults are 0.5 and 1.0 to match the most common United States high-school tables.
Does a failing grade in an AP course still get a bonus?
No. An F always contributes zero weighted and unweighted quality points, regardless of level, matching typical school policy.
Do credit hours change a weighted GPA?
Yes. Each course's weighted points are multiplied by its credits, and the total is divided by all credits combined. A course with more credits therefore moves the average further than a short one, in both the weighted and the unweighted result.
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/weighted-gpa-honors \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"courses":[{"name":"AP Calculus","grade":"A","credits":1,"level":"ap"},{"name":"Honors English","grade":"B+","credits":1,"level":"honors"},{"name":"Biology","grade":"A-","credits":1,"level":"regular"},{"name":"US History","grade":"B","credits":1,"level":"regular"}]}'const res = await fetch("https://api.kit.forhosting.com/edu/weighted-gpa-honors", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"courses": [
{
"name": "AP Calculus",
"grade": "A",
"credits": 1,
"level": "ap"
},
{
"name": "Honors English",
"grade": "B+",
"credits": 1,
"level": "honors"
},
{
"name": "Biology",
"grade": "A-",
"credits": 1,
"level": "regular"
},
{
"name": "US History",
"grade": "B",
"credits": 1,
"level": "regular"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/weighted-gpa-honors",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"courses": [
{
"name": "AP Calculus",
"grade": "A",
"credits": 1,
"level": "ap"
},
{
"name": "Honors English",
"grade": "B+",
"credits": 1,
"level": "honors"
},
{
"name": "Biology",
"grade": "A-",
"credits": 1,
"level": "regular"
},
{
"name": "US History",
"grade": "B",
"credits": 1,
"level": "regular"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/weighted-gpa-honors", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"courses":[{"name":"AP Calculus","grade":"A","credits":1,"level":"ap"},{"name":"Honors English","grade":"B+","credits":1,"level":"honors"},{"name":"Biology","grade":"A-","credits":1,"level":"regular"},{"name":"US History","grade":"B","credits":1,"level":"regular"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"courses":[{"name":"AP Calculus","grade":"A","credits":1,"level":"ap"},{"name":"Honors English","grade":"B+","credits":1,"level":"honors"},{"name":"Biology","grade":"A-","credits":1,"level":"regular"},{"name":"US History","grade":"B","credits":1,"level":"regular"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/weighted-gpa-honors", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"courses": [
{
"name": "AP Calculus",
"grade": "A",
"credits": 1,
"level": "ap"
},
{
"name": "Honors English",
"grade": "B+",
"credits": 1,
"level": "honors"
},
{
"name": "Biology",
"grade": "A-",
"credits": 1,
"level": "regular"
},
{
"name": "US History",
"grade": "B",
"credits": 1,
"level": "regular"
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.weighted_gpa_honors",
"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
The arithmetic is fully deterministic, runs free in your browser, and is available over the API at $0.002 per successful request with no language model and no external transcript service on the hot path.
What weighted GPA means and how honors and AP bonuses work
Empty course lists, invalid letter grades, missing credits, and non-positive credit values fail validation immediately with invalid_input so automation can distinguish a bad transcript row from a legitimate low average.
Input contract, formula, rounding, and response shape
POST a JSON body with a required courses array of one to fifty objects. Optional honors_bonus defaults to zero point five and ap_bonus defaults to one point zero; both must lie between zero and two inclusive so a district that uses a different table can override without forking the capability. Aliases items, rows, and classes are accepted for the courses field. On success the body includes weighted_gpa, unweighted_gpa, total_credits, quality_points_weighted, quality_points_unweighted, courses_count, the effective honors_bonus and ap_bonus, a breakdown array with every row echoed plus per-course quality points, and a formula string restating the contract.
Where a weighted GPA with honors API earns its keep
High-school registrars and guidance offices batch-call the API when importing grade exports to append verified weighted and unweighted columns, catching rows where a level flag was left blank or a credit hour was typed as zero.
Technical questions
What triggers an error, and what does a call cost?
Empty courses, invalid grades, missing or non-positive credits, out-of-range bonuses, or a non-object body return invalid_input and are not billed. Successful API calls are priced from $0.002.