PSA density calculator
A PSA of 4 ng/mL in a 40 cm³ prostate gives a PSA density of 0.1, below the commonly cited 0.15 reference. Dividing by gland volume puts the PSA value in the context of prostate size. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Psa
- 4
- Prostate volume
- 40
- Psa density
- 0.1
- Common cutoff
- 0.15
- Vs cutoff
- below
Prostate-specific antigen density, often shortened to PSA density or PSAD, is the serum PSA concentration divided by the prostate volume measured on transrectal or transabdominal ultrasound. Clinicians and students use the ratio because a given PSA value sits in a different context when the gland is large than when it is small: four nanograms per millilitre in a seventy-cubic-centimetre prostate is a lower density than the same PSA in a twenty-cubic-centimetre prostate. This calculator implements that closed form exactly. You supply a nonnegative serum PSA in nanograms per millilitre and a strictly positive prostate volume in cubic centimetres. The result is density in nanograms per millilitre per cubic centimetre.
How PSA density is defined and why volume matters
Prostate-specific antigen is a serine protease produced by prostatic epithelium and reported in serum as nanograms per millilitre. Gland size, however, is not constant. Benign prostatic hyperplasia can enlarge the prostate to many times the volume of a young adult gland, and a larger volume of epithelial tissue can leak more antigen into the blood without implying a higher likelihood of clinically significant cancer.
Dividing the serum concentration by the ultrasound volume produces PSA density, a simple ratio in nanograms per millilitre per cubic centimetre. Volume is typically obtained from transrectal ultrasound using the ellipsoid estimate of length times width times height times pi over six, or from a similar transabdominal measurement; this calculator does not recompute that ellipsoid. It takes the volume you already have and divides.
The closed form is PSAD equals PSA divided by prostate volume. A zero volume would make the quotient undefined, so the engine rejects it rather than returning Infinity or NaN. A negative serum PSA is not a laboratory concentration and is also rejected.
Zero PSA is allowed and yields a density of zero, which is a real laboratory possibility after prostatectomy or with an undetectable assay. Always frame outputs as educational estimates from the published ratio, not as a clinical diagnosis, a biopsy decision, or a substitute for a qualified clinician, multiparametric imaging, or local protocol. The commonly cited teaching cutoff of zero point one five nanograms per millilitre per cubic centimetre is returned as a reference comparison only; it is not a treatment threshold this tool is authorised to apply.
Where a PSA density calculator shows up in real work
Urology and internal-medicine courses constantly assign PSA-density drills from textbook laboratory pairs, so a single trusted oracle that returns the quotient beside the raw PSA and volume speeds grading and demo setup. Nursing and physician-assistant programs introduce gray-zone PSA interpretation before biopsy pathways, and instructors need deterministic answer keys that match hand arithmetic with an explicit ultrasound volume.
Product teams building educational clinical calculators want a documented PSA-and-volume path that clients can audit by hand rather than a black-box risk score that mixes free PSA, PHI, or magnetic-resonance imaging without disclosure. Research assistants preparing synthetic prostate-panel datasets need stable PSAD labels from known concentration and volume pairs without network calls or model drift.
If you later need percent-free PSA, prostate health index, 4Kscore, ellipsoid volume from three axes, or unit conversion among antigen assays, treat those as separate search intents and landings rather than overloading this PSA density calculator page. Always present results as educational estimates from the classical serum-PSA-over-volume formula; clinical decisions require qualified professionals, digital rectal examination, imaging when indicated, and protocols this tool does not collect.
Pin the rounded density in tests, keep requests small, and you get reproducible ratios for homework, LMS plugins, and edge workers without standing up a medical-device stack of your own.
What you can do with it
Classroom PSA density answer keys
Generate PSAD from textbook serum PSA and ultrasound volume pairs so instructors and auto-graders share one transparent ground truth.
Gray-zone PSA teaching demos
Show how the same PSA yields a lower density in a large gland than in a small gland without mixing free-PSA or MRI scores on this landing.
FAQ
What is PSA density?
PSA density (PSAD) is serum prostate-specific antigen divided by prostate volume from ultrasound, expressed in ng/mL/cm³. It places a PSA value in the context of gland size.
What formula do you use?
The result unit is ng/mL/cm³. An educational comparison to the common 0.15 cutoff is included; it is not a diagnosis.
What happens if prostate volume is zero?
Density is PSA divided by volume, so a zero volume is undefined and is rejected rather than returning Infinity or NaN.
Can PSA be zero? What if PSA is negative?
Zero PSA is allowed and yields density 0. Missing, non-numeric, NaN, and infinite values also fail.
What does the PSA density calculator cost?
The browser tool is free and runs locally.
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/health/psa-density \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"psa":4,"prostate_volume":40}'const res = await fetch("https://api.kit.forhosting.com/health/psa-density", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"psa": 4,
"prostate_volume": 40
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/psa-density",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"psa": 4,
"prostate_volume": 40
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/psa-density", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"psa":4,"prostate_volume":40}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"psa":4,"prostate_volume":40}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/psa-density", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"psa": 4,
"prostate_volume": 40
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.psa_density",
"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
A zero volume would divide by zero, and a negative PSA is not a laboratory concentration, so those inputs fail with invalid_input instead of inventing a number.
How PSA density is defined and why volume matters
The arithmetic is pure floating-point with stable rounding to twelve significant digits, no network calls, no random seeds, and no wall-clock timestamps, so identical pairs always serialize to the same JSON.
What you send, what you get back, and how errors behave
Send two required fields. The field psa is serum prostate-specific antigen in nanograms per millilitre and must be a finite nonnegative number; zero is allowed and negative values fail. A prostate volume of zero fails because density is undefined when the denominator is zero. A negative volume fails because a negative gland size is not a valid ultrasound measurement. Classic smoke checks include PSA four with volume forty, which yields density zero point one and sits below the common cutoff, and PSA seven point two with volume thirty-six, which yields density zero point two and sits at or above it. If your upstream form collects PSA in nanograms per litre or volume in millilitres under a different name, convert to nanograms per millilitre and cubic centimetres first and pass the numbers here. Aliases serum_psa, psa_ng_ml, and psa_level are accepted. The field prostate_volume is the gland volume in cubic centimetres from transrectal or transabdominal ultrasound and must be a finite number strictly greater than zero; aliases volume, prostate_vol, volume_cm3, and trus_volume are accepted. Missing required fields, empty strings, non-numeric values, NaN, and Infinity fail with invalid_input and are not charged. On success the response echoes cleaned psa and prostate_volume, returns psa_density as the quotient, sets unit to ng/mL/cm3, restates the formula string PSAD equals PSA divided by prostate_volume, and sets method to psa_density. It also reports common_cutoff as zero point one five and vs_cutoff as below or at_or_above so teaching materials can show the classic Benson-era comparison without implying a diagnosis. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where a PSA density calculator shows up in real work
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Deterministic prostate-panel fixtures
Bulk-produce stable PSA density labels for synthetic datasets and regression tests, with hard invalid_input on zero volume or negative PSA.