eGFR kidney function calculator
A 50-year-old woman with a serum creatinine of 1 mg/dL has an eGFR of 68.6 mL/min/1.73 m², stage G2. The CKD-EPI 2021 equation, with no race term, needs only creatinine, age and sex, and labels the filtration stage. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Serum creatinine (mg/dL)
- 1
- Age (years)
- 50
- Sex
- Female
- Estimated GFR
- 68.6
- Equation
- CKD-EPI 2021
Estimated glomerular filtration rate is the standard screening number clinicians and health apps use when they need a quick read on how well the kidneys clear waste from blood. This calculator implements the CKD-EPI 2021 creatinine equation: enter serum creatinine in mg/dL, age in years, and sex, and receive eGFR in mL/min/1.73 m² plus a KDIGO-style GFR category label. The 2021 refit removed the race coefficient present in the earlier 2009 formula — race is not a biological variable and using it to adjust a lab result can under-estimate kidney disease in Black patients, so this tool never asks for it.
What eGFR is and why the equation moved to CKD-EPI 2021
Glomerular filtration rate is the volume of blood filtered by the kidney glomeruli per unit time, normalized to body surface area. Direct measurement (inulin clearance, radionuclide methods) is accurate but impractical for routine care, so laboratories report an estimate derived from serum creatinine and demographic factors. The Chronic Kidney Disease Epidemiology Collaboration (CKD-EPI) 2009 creatinine equation was the long-standing standard, but it included an optional coefficient that raised the reported eGFR for patients identified as Black.
NIDDK and the National Kidney Foundation / American Society of Nephrology task force concluded that using race this way is not scientifically justified and can delay diagnosis and transplant referral for Black patients with earlier-stage kidney disease. The 2021 refit (Inker et al., New England Journal of Medicine, 2021) re-derived the equation from the same pooled cohorts without any race term, trading a small amount of average accuracy for a formula that treats every patient the same way.
Inputs, units, and validation rules
Send creatinine as a finite positive number in milligrams per deciliter (mg/dL)—the unit assumed by the CKD-EPI coefficients. Age must be a whole number of years from 1 through 120. Sex must be male or female (single-letter m/f is accepted and normalized); the equation only has published coefficients for those two categories.
Missing required fields, non-numeric types, and ages outside range likewise fail with a clear message naming the field.
How to interpret results, limits, and integration
eGFR is a screening estimate, not a standalone diagnosis of chronic kidney disease, and this tool does not provide medical advice or clinical interpretation. KDIGO stages G1 through G5 classify filtration level only; full CKD staging also considers albuminuria, clinical context, and whether reduced filtration is chronic or acute. Values can be temporarily lowered by acute illness, high meat intake, certain drugs, muscle mass extremes, or lab assay differences, and creatinine-only equations are known to be less accurate at the extremes of muscle mass regardless of race.
Do not use the output alone to dose nephrotoxic drugs, clear patients for procedures, or make a diagnosis — any of those decisions needs a licensed clinician working from the full clinical picture, and cystatin-C-based or measured clearance methods are preferred when creatinine alone is unreliable.
What you can do with it
Patient education and triage forms
Let users explore how creatinine, age, and sex map to eGFR on a public health page before they talk with a clinician, with transparent, race-free formula naming.
Research coding and dataset labels
Attach a reproducible CKD-EPI 2021 eGFR and KDIGO category to study rows when only serum creatinine and demographics are available.
Product prototypes and clinical decision support scaffolds
Wire a deterministic, race-free kidney-function step into apps and checklists that later hand off to licensed clinical systems for real decisions.
FAQ
Which eGFR equation does this calculator use?
The CKD-EPI 2021 creatinine equation, which does not use race. Results are in mL/min/1.73 m² and rounded to one decimal place.
What units should I use for serum creatinine?
Milligrams per deciliter (mg/dL). If your lab reports µmol/L, divide by 88.4 to convert to mg/dL before calling the tool.
What happened to the race option from CKD-EPI 2009?
It was removed. NIDDK and NKF/ASN recommend the race-free 2021 equation because the earlier race coefficient was not scientifically justified and could delay diagnosis in Black patients. This tool no longer accepts a race input.
What happens if creatinine is zero or negative?
Non-positive serum creatinine is rejected because it is not a valid input to the CKD-EPI power terms.
Can I use this result to make a clinical decision?
No. This is a screening estimate for education, prototyping, and research, not medical advice. Diagnosis and treatment decisions need a licensed clinician reviewing the full clinical picture.
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/egfr \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"creatinine":1,"age":50,"sex":"female"}'const res = await fetch("https://api.kit.forhosting.com/health/egfr", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"creatinine": 1,
"age": 50,
"sex": "female"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/egfr",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"creatinine": 1,
"age": 50,
"sex": "female"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/egfr", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"creatinine":1,"age":50,"sex":"female"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"creatinine":1,"age":50,"sex":"female"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/egfr", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"creatinine": 1,
"age": 50,
"sex": "female"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.egfr",
"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 math is fully deterministic and runs locally—no models, labs, or network calls—so the same inputs always produce the same result and patient-like values never leave the request path. This is a screening estimate, not a diagnosis: use it for education, triage checklists, research coding, and product prototypes that need a transparent, auditable eGFR step, and always pair the output with clinician judgment before any care decision.
What eGFR is and why the equation moved to CKD-EPI 2021
This capability implements that published race-free 2021 formula exactly, with no hidden adjustments, so engineers and educators can reproduce the reference values and wire the same number into dashboards, forms, and API pipelines.
Inputs, units, and validation rules
If your lab reports micromoles per liter, convert first by dividing µmol/L by 88.4 before calling the API. Non-positive or zero creatinine is rejected with invalid_input because a non-positive serum value is not clinically meaningful and would break the power terms. On success the response returns egfr rounded to one decimal place, the unit string, equation name CKD-EPI 2021, a KDIGO GFR stage code (G1–G5) with a short stage_label, and echoes of the normalized inputs so callers can audit what was computed without re-parsing the request.
How to interpret results, limits, and integration
The free browser page runs the same lib as the API; programmatic calls cost $0.002 per request from prepaid KIT balance with unit item. Pair the JSON fields with your own UI—traffic-light bands, trend charts, or EHR notes—while keeping clinical interpretation outside this calculator.
Technical questions
How much does the API cost?
The browser widget runs free and locally. The same computation via the API is billed at $0.002 per request from prepaid KIT balance, with no charge on invalid_input failures.