D&D point buy cost calculator
The array 15, 14, 13, 12, 10 and 8 costs 9, 7, 5, 4, 2 and 0, exactly 27 points. Enter your six scores and see at once whether your build fits the campaign budget. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Strength
- 15
- Dexterity
- 14
- Constitution
- 13
- Intelligence
- 12
- Wisdom
- 10
- Charisma
- 8
- Total cost
- 27
- Budget
- 27
- Remaining
- 0
- Cost table
- 5e PHB point buy (scores 8-15)
Building a fifth-edition character with the Player's Handbook point-buy method means every ability score from eight through fifteen carries a fixed cost, and the six costs must fit inside your campaign budget—usually twenty-seven points. Players, dungeon masters, and character-builder tools need a single deterministic total instead of re-adding the table by hand for every draft. This D&D point buy cost calculator accepts Strength, Dexterity, Constitution, Intelligence, Wisdom, and Charisma, looks up each score on the official 5e cost table, returns the per-ability costs and the grand total, and optionally compares that total to a budget so you can see remaining points or an overspend.
How the fifth-edition point-buy cost table works
In Dungeons & Dragons fifth edition, the Player's Handbook defines a closed point-buy table for ability scores between eight and fifteen inclusive. A score of eight costs zero points—the floor of the method—then each step upward costs one more point until thirteen (five points), after which the curve steepens: fourteen costs seven and fifteen costs nine. Scores below eight or above fifteen are outside this method during purchase; racial bonuses and other features apply after point buy, so this calculator only prices the raw purchase scores.
The classic standard-array package—fifteen, fourteen, thirteen, twelve, ten, and eight—sums to exactly twenty-seven points under that table, which is why many tables use twenty-seven as the default budget. Home games sometimes change the pool (twenty for a grittier start, thirty-two for a high-power table), but they rarely change the per-score costs themselves. This capability hard-codes the PHB cost map, sums the six lookups, and never invents fractional or out-of-range prices.
Knowing the table cold is less important than having a machine that always applies the same numbers your players saw in the book last session.
What you can do with it
Session-zero party balance
Verify every PC's six purchase scores fit the table budget (default 27) before racial bonuses apply.
FAQ
What is the D&D 5e point-buy cost of each ability score?
Under the Player's Handbook table: 8 costs 0, 9 costs 1, 10 costs 2, 11 costs 3, 12 costs 4, 13 costs 5, 14 costs 7, and 15 costs 9.
Which scores can I enter?
Integers from 8 through 15 for strength, dexterity, constitution, intelligence, wisdom, and charisma.
Does this apply racial bonuses or the standard array?
No. It only prices the six purchase scores on the point-buy cost table. Apply species or origin bonuses after purchase in your own layer. Standard array is a fixed set of scores, not a different cost map.
Does the standard array cost exactly 27 points?
Yes. Under point buy, 15, 14, 13, 12, 10 and 8 cost 9, 7, 5, 4, 2 and 0, which add up to 27, the usual campaign budget, with nothing left over.
Can I use a different point budget than 27?
Yes. Set any budget from 0 to 54 and the result shows how many points remain or how far over you went. Leave it empty and the standard 27 is used.
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/hobby/dnd-point-buy \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"strength":15,"dexterity":14,"constitution":13,"intelligence":12,"wisdom":10,"charisma":8}'const res = await fetch("https://api.kit.forhosting.com/hobby/dnd-point-buy", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"strength": 15,
"dexterity": 14,
"constitution": 13,
"intelligence": 12,
"wisdom": 10,
"charisma": 8
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/dnd-point-buy",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"strength": 15,
"dexterity": 14,
"constitution": 13,
"intelligence": 12,
"wisdom": 10,
"charisma": 8
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/dnd-point-buy", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"strength":15,"dexterity":14,"constitution":13,"intelligence":12,"wisdom":10,"charisma":8}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"strength":15,"dexterity":14,"constitution":13,"intelligence":12,"wisdom":10,"charisma":8}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/dnd-point-buy", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"strength": 15,
"dexterity": 14,
"constitution": 13,
"intelligence": 12,
"wisdom": 10,
"charisma": 8
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.dnd_point_buy",
"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
How the fifth-edition point-buy cost table works
If you pass a score of sixteen or seven, the request fails with invalid_input naming the field, matching the rule that point buy only sells eight through fifteen.
Input contract, response shape, and budget comparison
An optional budget integer (default twenty-seven, range zero to fifty-four) is the campaign point pool used only for comparison. POST a JSON body with six required integer ability scores: strength, dexterity, constitution, intelligence, wisdom, and charisma. Each must be a whole number from eight to fifteen; short aliases such as str, dex, con, int, wis, and cha are accepted. Missing fields, non-integers, and scores outside eight to fifteen fail with invalid_input and are not billed. On success the body echoes the six scores, a costs object with the point cost of each ability, total_cost as their sum, the effective budget, remaining as budget minus total_cost, within_budget as a boolean that is true when remaining is non-negative, and a short cost_table label identifying the 5e PHB map. Example: fifteen, fourteen, thirteen, twelve, ten, and eight yields costs nine, seven, five, four, two, and zero for a total_cost of twenty-seven, remaining zero, and within_budget true under the default budget. If you set budget to twenty and keep the same scores, remaining becomes negative seven and within_budget is false—useful for house rules without changing the underlying cost table. Pair the response with your own UI to assign scores to roles or to apply racial bonuses after purchase; this endpoint prices the six purchase scores only and does not apply species traits, feats, or multiclass prerequisites.
Where a point-buy cost API earns its keep
Character builders and VTT companion apps need a tiny oracle that re-costs a draft whenever a player bumps Constitution from thirteen to fourteen and expects the remaining pool to drop by two, not by one. Session-zero helpers and party-balance sheets compare six PCs against the same budget so nobody sneaks in a sixteen by misreading the table. Failed validation does not consume balance. Discord bots and Discord-slash command wrappers can POST scores from a message and reply with total_cost and remaining without embedding table logic in every bot. Keep requests small, pin total_cost and the costs object in tests, and you get reproducible point-buy totals for builders, blogs, and edge workers without standing up a full rules engine of your own.
Integration use cases
Character builder drafts
Recalculate total_cost and remaining points whenever a player changes an ability score in an 8–15 point-buy draft.
Bots and automation
Let Discord or sheet scripts POST scores and return the PHB point total without embedding the cost table.
Technical questions
What is the default budget?
27 points, the common PHB campaign pool. Pass budget (or points) to compare against another house-rule pool from 0 to 54; remaining and within_budget reflect that comparison.
What does the D&D point buy cost calculator cost to call?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.