SAPS II calculator
A 65-year-old medical ICU admission with normal vital signs and lab values scores 18 SAPS II points, a predicted hospital mortality of about 3 %. Enter age, admission type, chronic disease and the worst values of the first 24 hours. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
The Simplified Acute Physiology Score II, published by Le Gall, Lemeshow, and Saulnier in 1993, converts age, admission type, chronic disease, and twelve admission physiological measurements into an integer ICU severity score and a predicted hospital mortality probability. This calculator applies the original JAMA point tables and the logistic equation logit equals negative 7.7631 plus 0.0737 times the score plus 0.9971 times the natural log of score plus one, then maps that logit to a probability with the standard expit.
What SAPS II measures and how the Le Gall 1993 tables add up
The Simplified Acute Physiology Score II is an additive ICU severity system derived by Le Gall, Lemeshow, and Saulnier from 13,152 consecutive adult admissions across 137 medical and surgical intensive care units in twelve countries, and published in JAMA in 1993. Unlike APACHE II, SAPS II does not require a primary diagnosis to estimate hospital death: twelve physiological measurements recorded as the worst values during the first twenty-four hours, plus age, type of admission, and one chronic-disease category, are converted to integer points from published tables and summed.
Age contributes zero under forty years, seven from forty through fifty-nine, twelve from sixty through sixty-nine, fifteen from seventy through seventy-four, sixteen from seventy-five through seventy-nine, and eighteen at eighty or older. Heart rate, systolic blood pressure, temperature at or above thirty-nine degrees Celsius, the PaO2/FiO2 ratio when the patient is ventilated or on CPAP, twenty-four-hour urine output, blood urea nitrogen, white-cell count, potassium, sodium, bicarbonate, bilirubin, and the Glasgow Coma Scale each add a published weight that is larger when the value is more abnormal.
Admission type adds zero for scheduled surgery, six for a medical admission, and eight for unscheduled surgery. Chronic disease adds nine for metastatic cancer, ten for hematologic malignancy, and seventeen for AIDS, taking the single most severe category when more than one applies. The integer total is the SAPS II score.
Hospital mortality then follows the original logistic: logit equals negative 7.7631 plus 0.0737 times the score plus 0.9971 times the natural logarithm of the score plus one, and probability equals e to the logit over one plus e to the logit.
Input contract, units, validation, and the shape of a successful response
Age is years at last birthday. Heart rate is beats per minute. Systolic blood pressure is millimetres of mercury.
Temperature is degrees Celsius. Glasgow Coma Scale is the numeric total, typically three through fifteen; if the patient is sedated, use the score recorded before sedation, matching the original instructions. Urine output is litres in twenty-four hours, not millilitres: half a litre is 0.5, not 500.
Blood urea nitrogen is milligrams per decilitre; urea in millimoles per litre times 2.8 is the usual conversion to BUN. White-cell count is thousands per cubic millimetre, equivalent to 10^9 per litre. Potassium, sodium, and bicarbonate are milliequivalents per litre.
Bilirubin is milligrams per decilitre. Ventilated defaults to false and contributes zero oxygenation points when false. Unknown admission or chronic-disease tokens also fail.
How to read predicted mortality, where the calculator belongs, and what it does not decide
A SAPS II of about twenty-nine corresponds to roughly ten percent predicted hospital mortality in the original logistic, forty to about twenty-five percent, fifty-two to about fifty percent, sixty-four to about seventy-five percent, and seventy-seven to about ninety percent. Those figures are cohort probabilities from the 1993 European and North American sample, not a personal prognosis, and they do not replace serial examination, diagnosis, source control, or a clinician's view of comorbidities this table never captures.
Cardiac-surgery, burn, and paediatric patients were excluded from the derivation sample, so applying the logistic there is an extrapolation. Use the calculator for education, exam keys, research coding of adult ICU rows, and product prototypes that need a deterministic SAPS II step before handing off to licensed systems. Neighbouring tools such as the Pneumonia Severity Index, the Revised Cardiac Risk Index, or the Revised Trauma Score answer different search intents and should keep their own landings rather than being overloaded here.
Because every physiological input is checked for finiteness, a spreadsheet that leaks NaN or a blank cell fails closed instead of silently scoring a missing lab as normal.
What you can do with it
Teaching vignettes and exam keys
Score textbook ICU cases so instructors and auto-graders share one Le Gall 1993 ground truth for the SAPS II total and predicted hospital mortality.
Research coding of adult ICU cohorts
Attach a reproducible SAPS II score and mortality probability to study rows when age, admission type, chronic disease, and the twelve physiological fields are already in the table.
Prototype decision-support scaffolds
Wire a transparent SAPS II step into educational apps and checklists that later hand off to licensed clinical systems for real decisions.
FAQ
What is the SAPS II score?
It is Le Gall’s 1993 Simplified Acute Physiology Score II for adult ICU patients. This tool returns the integer point total, the original logistic logit, and the predicted hospital mortality probability and percent.
How is predicted hospital mortality calculated from the score?
logit = −7.7631 + 0.0737 × SAPS II + 0.9971 × ln(SAPS II + 1). Probability is e^logit / (1 + e^logit). Those coefficients are from the original JAMA paper, not a later customisation.
Can I use this result to decide ICU admission or treatment?
No. This is an educational arithmetic aid, not medical advice. Intensity of care and prognosis need a licensed clinician and the rest of the clinical picture this calculator does not collect.
Which values should I enter for the first 24 hours?
For each measurement, enter the worst value recorded during the first 24 hours in intensive care, and the highest temperature. If the patient is sedated, use the Glasgow score taken before sedation.
How is SAPS II different from APACHE II?
SAPS II does not need a primary diagnosis to estimate the risk of death in hospital. It only adds points for age, admission type, one chronic disease category and twelve physiological measurements.
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/saps-ii \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":65,"heart_rate":88,"systolic_bp":118,"temperature_c":37.2,"gcs":15,"urine_output_l":1.8,"bun":18,"wbc":8.5,"potassium":4.1,"sodium":138,"bicarbonate":24,"bilirubin":0.8,"admission_type":"medical"}'const res = await fetch("https://api.kit.forhosting.com/health/saps-ii", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 65,
"heart_rate": 88,
"systolic_bp": 118,
"temperature_c": 37.2,
"gcs": 15,
"urine_output_l": 1.8,
"bun": 18,
"wbc": 8.5,
"potassium": 4.1,
"sodium": 138,
"bicarbonate": 24,
"bilirubin": 0.8,
"admission_type": "medical"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/saps-ii",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 65,
"heart_rate": 88,
"systolic_bp": 118,
"temperature_c": 37.2,
"gcs": 15,
"urine_output_l": 1.8,
"bun": 18,
"wbc": 8.5,
"potassium": 4.1,
"sodium": 138,
"bicarbonate": 24,
"bilirubin": 0.8,
"admission_type": "medical"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/saps-ii", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":65,"heart_rate":88,"systolic_bp":118,"temperature_c":37.2,"gcs":15,"urine_output_l":1.8,"bun":18,"wbc":8.5,"potassium":4.1,"sodium":138,"bicarbonate":24,"bilirubin":0.8,"admission_type":"medical"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":65,"heart_rate":88,"systolic_bp":118,"temperature_c":37.2,"gcs":15,"urine_output_l":1.8,"bun":18,"wbc":8.5,"potassium":4.1,"sodium":138,"bicarbonate":24,"bilirubin":0.8,"admission_type":"medical"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/saps-ii", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"age": 65,
"heart_rate": 88,
"systolic_bp": 118,
"temperature_c": 37.2,
"gcs": 15,
"urine_output_l": 1.8,
"bun": 18,
"wbc": 8.5,
"potassium": 4.1,
"sodium": 138,
"bicarbonate": 24,
"bilirubin": 0.8,
"admission_type": "medical"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.saps_ii",
"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
Every physiological value must be a finite number; a missing, infinite, or non-numeric vital or laboratory result fails with invalid_input and is not billed. Treat the JSON as transparent arithmetic, not a diagnosis or a substitute for licensed clinical judgment.
What SAPS II measures and how the Le Gall 1993 tables add up
This capability implements that published table and equation exactly, with no hidden weights, so a hand-scored vignette and the JSON body can be compared line by line.
Input contract, units, validation, and the shape of a successful response
Send a JSON object whose physiological fields are finite numbers. If ventilated is true, pao2_fio2 is required as the ratio in millimetres of mercury using FiO2 as a fraction between zero and one, not a percentage. Admission type must be scheduled_surgical, medical, or unscheduled_surgical. Chronic disease must be none, metastatic_cancer, hematologic_malignancy, or aids, and defaults to none. A missing, empty, infinite, or non-numeric physiological value fails with invalid_input naming the field and stating that a finite number was expected; those failures are not billed. On success the body returns the integer score, mortality_probability on the unit interval, mortality_percent, the logit used by the logistic, the point contribution of each table, echoed admission_type, chronic_disease, and ventilated, and formula SAPS II Le Gall 1993. Optional output keys such as pao2_fio2 are omitted rather than set to null when they were not supplied. Pair the free browser form with the same contract from scripts; successful API calls cost $0.002 per item and validation failures do not consume prepaid balance.
How to read predicted mortality, where the calculator belongs, and what it does not decide
Do not triage, withhold treatment, or quote a family a percent chance from this JSON alone. The arithmetic is pure parse with no outbound network, so identical inputs always yield identical JSON, and the published API price remains $0.002 per successful request.
Technical questions
What happens if a physiological value is missing, infinite, or not a number?
The call fails with invalid_input. Every physiological field must be a finite number; without that the SAPS II tables are not defined and the request is not billed.
Do I need PaO2/FiO2 if the patient was not ventilated?
No. When ventilated is false (the default), oxygenation points are zero and pao2_fio2 may be omitted. When ventilated is true, pao2_fio2 is required as a finite ratio in mmHg with FiO2 as a fraction.
What does the SAPS II calculator cost?
The browser widget runs free and locally. The same computation via the API is billed at $0.002 per successful request from prepaid KIT balance; invalid_input failures are not charged.