Sperm analysis calculator
Compare a semen analysis with the WHO 2021 lower reference limits: 2.5 mL, 45 million per mL, 55% total motility and 8% normal forms are all normal, for a total of 112.5 million sperm. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Volume
- 2.5
- Concentration
- 45
- Motility
- 55
- Morphology
- 8
- Volume limit
- 1.4
- Volume status
- normal
- Concentration limit
- 16
- Concentration status
- normal
A semen analysis report lists ejaculate volume, sperm concentration, motility, and the percentage of spermatozoa with normal forms. Interpreting those four numbers against a named public table is a common homework, counselling, and quality-check task, but the World Health Organization sixth-edition limits from 2021 are easy to mix up with the older 2010 fifth-edition figures. The tool is an educational comparison, not a diagnosis of infertility or a substitute for a reviewed laboratory report.
WHO 2021 lower reference limits and how each status is assigned
The World Health Organization sixth edition laboratory manual, published in 2021, restated lower reference limits for human semen using men whose partners conceived within twelve months. Those figures are fifth-percentile values, not a diagnosis of infertility, and this calculator applies the 2021 table as published. Semen volume is compared with one point four millilitres.
Sperm concentration is compared with sixteen million spermatozoa per millilitre. Motility is treated as total motility, progressive plus non-progressive, and is compared with forty-two percent; the separate 2021 progressive-motility limit of thirty percent is a different row and is not used here. Morphology is the percentage of spermatozoa with normal forms and is compared with four percent.
A derived total sperm number, volume multiplied by concentration, is compared with thirty-nine million spermatozoa per ejaculate so you can see when the product of two in-range values still sits below that independent row. Equality at the limit counts as normal because the WHO number is a lower bound. The engine does not read abstinence time, pH, viscosity, round cells, vitality, or DNA fragmentation, and it does not issue a fertility prognosis.
What you can do with it
Clinic worksheet and intake checks
Flag which of volume, concentration, total motility, and morphology sit below the published 2021 limits before a counsellor walks through the printed laboratory report.
Template and spreadsheet audits
Catch intake forms that still use 2010 fifth-edition cut-offs by running the same four numbers through this 2021 oracle and comparing the labels.
FAQ
Which WHO 2021 limits does the sperm analysis calculator use?
Volume 1.4 mL, concentration 16 million/mL, total motility (PR+NP) 42%, and normal forms 4%. A derived total sperm number of volume times concentration is compared with 39 million per ejaculate. Values at a limit are labelled normal.
Is motility total motility or progressive motility?
Total motility (progressive plus non-progressive). The WHO 2021 progressive-motility limit of 30% is a different table row and is not applied. Convert a PR-only figure before you send motility if your laboratory reports progressive motility alone.
What happens if semen volume is negative?
A negative millilitre figure is not a physical ejaculate volume.
Why can total sperm count be low when volume and concentration are normal?
Because the total is volume multiplied by concentration and is checked against its own limit of 39 million per ejaculate. Two values that each pass can still give a product below that row.
Does a value below the reference limit mean infertility?
No. The limits are the 5th percentile of men whose partners conceived within 12 months, so they describe a reference group, not a diagnosis. The comparison gives no fertility prognosis and does not replace a reviewed lab report.
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/sperm-analysis \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"volume":2.5,"concentration":45,"motility":55,"morphology":8}'const res = await fetch("https://api.kit.forhosting.com/health/sperm-analysis", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"volume": 2.5,
"concentration": 45,
"motility": 55,
"morphology": 8
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/sperm-analysis",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"volume": 2.5,
"concentration": 45,
"motility": 55,
"morphology": 8
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/sperm-analysis", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"volume":2.5,"concentration":45,"motility":55,"morphology":8}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"volume":2.5,"concentration":45,"motility":55,"morphology":8}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/sperm-analysis", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"volume": 2.5,
"concentration": 45,
"motility": 55,
"morphology": 8
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.sperm_analysis",
"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_volume_ml | 50 |
max_concentration | 1000 |
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
This sperm analysis calculator accepts the four laboratory values, compares each one with the 2021 lower reference limit, and labels it normal or below_reference. Volume below zero is rejected as invalid_input because a negative ejaculate volume is not a physical measurement.
WHO 2021 lower reference limits and how each status is assigned
Each parameter is labelled normal when the submitted value is greater than or equal to its lower reference limit, and below_reference when it is strictly smaller. Treat the JSON as an educational comparison against a named public table, not as a medical-device output or a substitute for a laboratory report reviewed by a clinician who knows the rest of the history.
Input contract, response shape, and error behaviour
A classic smoke check is volume two point five millilitres, concentration forty-five million per millilitre, motility fifty-five percent, and morphology eight percent, which is normal on every row including the derived total. POST a JSON body with four required finite numbers. The field volume is semen volume in millilitres and must be zero or greater; aliases volume_ml, semen_volume, and ejaculate_volume are accepted. A negative volume fails with invalid_input and the message that volume cannot be negative, and that failure is not billed. Zero millilitres is a legal input and is labelled below_reference against the one-point-four millilitre limit. The field concentration is sperm concentration in million spermatozoa per millilitre and must be a finite non-negative number; aliases sperm_concentration, concentration_million_per_ml, and count are accepted. The field motility is total motility as a percentage from zero to one hundred; aliases total_motility, motility_percent, and motility_pct are accepted. The field morphology is the percentage of spermatozoa with normal forms, also from zero to one hundred; aliases morphology_percent, normal_forms, and kruger are accepted. Each numeric field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, booleans, NaN, and Infinity fail with invalid_input naming the field. On success the body echoes the four values with their WHO 2021 limits and a status of normal or below_reference for each, plus derived total_sperm, total_sperm_limit, and total_sperm_status. below_reference_count is how many of the four submitted parameters sit below their limits, and overall is normal only when that count is zero. Pair the JSON with your own counselling notes if you need narrative; this endpoint only classifies the four numbers against the named table.
Where a WHO 2021 sperm analysis check is used, pricing, and honest limits
Exam generators and LMS plugins need a deterministic engine that rejects a negative semen volume instead of silently emitting a status that a buggy grader might treat as success. Product teams building educational reproductive-health widgets want a documented WHO 2021 path that students can audit by hand, rather than a black-box fertility score that mixes vitality, DNA fragmentation, and progressive motility without disclosure. Keep expectations educational: this is a calculation and learning tool, not a diagnostic medical device, and it does not replace a reviewed semen analysis, a specialist interpretation, or local laboratory methods. People with a fertility concern should follow professional medical advice rather than any single automated comparison. Andrology teaching labs and reproductive-medicine clerkships constantly assign worksheets that ask whether a printed semen report meets current WHO lower reference limits, so a single trusted oracle that returns normal or below_reference beside each limit speeds grading and demo setup. Fertility-clinic intake forms that already store volume, concentration, motility, and morphology can call a tiny parse API instead of reimplementing the 2021 table in every spreadsheet language, which is how 2010 figures quietly survive in old templates. Because this capability is a pure parse engine, every successful API call costs the published $0.002 base price with no model tokens and no outbound network, and failed validation does not consume prepaid balance. Pin overall and the four status fields in tests, send total motility rather than progressive motility alone, and never treat a below_reference label on one parameter as a diagnosis of male-factor infertility.
Integration use cases
Classroom WHO 2021 answer keys
Check textbook semen-analysis pairs against the 2021 lower reference limits so instructors and auto-graders share one transparent normal versus below_reference ground truth.
Technical questions
Does a below_reference result mean infertility?
No. WHO lower reference limits are fifth-percentile values from a fertile reference population, not diagnostic cut-offs. This calculator is an educational comparison, not a medical device and not a substitute for a reviewed laboratory report.
What does the sperm analysis calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.