RCRI calculator
High-risk surgery plus a history of ischemic heart disease gives an RCRI of 2: risk class III, with a 6.6% rate of major cardiac events in Lee's original study. Tick the six factors to get the score and class. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
The Revised Cardiac Risk Index, often called Lee's index after the 1999 Circulation derivation, is a six-item preoperative score for major cardiac complications after noncardiac surgery. This calculator accepts six clinical flags—high-risk surgery, ischemic heart disease, heart failure, cerebrovascular disease, insulin-treated diabetes, and a creatinine above 2.0 mg/dL—and returns the integer score from zero through six, risk class I through IV, and the published Lee major-cardiac-event percentage.
What the Revised Cardiac Risk Index measures and how Lee's six points work
The Revised Cardiac Risk Index is a bedside additive rule that Lee and colleagues derived and then prospectively validated for adults undergoing elective major noncardiac surgery, and it remains one of the most taught preoperative cardiac scores in anesthesia, cardiology, and surgical clerkships. Each of six independent predictors contributes exactly one point when present and zero when absent. The first factor is high-risk surgery, meaning intraperitoneal, intrathoracic, or suprainguinal vascular procedures rather than low-risk ambulatory work.
The second is a history of ischemic heart disease, including prior myocardial infarction, a positive exercise test, current ischemic chest pain, nitrate therapy, or pathologic Q waves. The third is a history of congestive heart failure, including pulmonary edema, paroxysmal nocturnal dyspnea, bilateral rales, an S3 gallop, or a chest radiograph with pulmonary vascular redistribution. The fourth is cerebrovascular disease, meaning a prior transient ischemic attack or stroke.
The fifth is diabetes mellitus treated with insulin in the preoperative period. The sixth is a preoperative serum creatinine greater than 2.0 milligrams per decilitre, equivalent to 177 micromoles per litre. The score is the count of those six flags, so it ranges from zero to six.
Class I is zero points, class II is one point, class III is two points, and class IV is three or more points. In the original derivation cohort the rates of major cardiac complications—myocardial infarction, pulmonary edema, ventricular fibrillation or primary cardiac arrest, and complete heart block—were 0.4 percent, 0.9 percent, 6.6 percent, and 11 percent respectively.
How to read risk classes, where the calculator belongs, and what it does not decide
Risk class I is low risk, with a Lee derivation major-cardiac-event rate of 0.4 percent, and is the usual teaching band when none of the six factors is present. Class II is low-intermediate risk at 0.9 percent with a single factor. Class III is intermediate risk at 6.6 percent with two factors, which is the band where many teaching discussions start to mention further testing or closer perioperative surveillance rather than routine discharge planning.
Class IV is high risk at 11 percent once three or more factors are present; scores of three, four, five, and six share that class rather than inventing extra bands that the original paper did not publish. Those percentages are historical cohort figures from 1999, not a personal prognosis, and they do not replace functional-capacity assessment, the inherent risk of the planned procedure beyond the high-risk flag, natriuretic peptides, stress testing, or a clinician's view of comorbidities this table never captures.
Use the calculator for education, exam keys, research coding of preoperative rows, and product prototypes that need a deterministic RCRI step before handing off to licensed systems. Neighbouring tools such as the Gupta myocardial infarction or cardiac arrest calculator, NSQIP, or an eGFR engine answer different search intents and should keep their own landings rather than being overloaded here.
What you can do with it
Teaching vignettes and exam keys
Score textbook preoperative cases so instructors and auto-graders share one Lee 1999 ground truth for the six flags, the integer score, and class I–IV.
Research coding of surgical cohorts
Attach a reproducible RCRI total and risk class to study rows when the six binary predictors are already in the table.
Prototype decision-support scaffolds
Wire a transparent Revised Cardiac Risk Index step into educational apps and checklists that later hand off to licensed clinical systems for real decisions.
FAQ
What is the Revised Cardiac Risk Index (RCRI)?
It is Lee's 1999 six-item preoperative score for major cardiac complications after noncardiac surgery. This tool returns the integer score (0–6), risk class I–IV, a short label, and the published major-cardiac-event percentage.
Which six factors does the calculator count?
High-risk surgery, ischemic heart disease, heart failure, cerebrovascular disease, insulin-treated diabetes, and preoperative creatinine greater than 2.0 mg/dL. Each present factor adds one point.
How should I interpret risk classes I through IV?
Class I (0 points) is low risk at 0.4%. Class II (1 point) is low-intermediate at 0.9%. Class III (2 points) is intermediate at 6.6%. Class IV (≥3 points) is high risk at 11%. Figures are historical cohort rates, not a personal prognosis.
Can I use this result to clear a patient for surgery?
No. This is an educational arithmetic aid, not medical advice. Cardiac clearance, monitoring, and whether to proceed need a licensed clinician and the rest of the clinical picture this calculator does not collect.
Which operations count as high-risk surgery?
Intraperitoneal, intrathoracic or suprainguinal vascular procedures. Low-risk ambulatory operations do not count, so the surgery factor stays at zero points for them.
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/rcri \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"high_risk_surgery":true,"ischemic_heart_disease":true,"heart_failure":false,"cerebrovascular_disease":false,"insulin_diabetes":false,"creatinine_gt_2":false}'const res = await fetch("https://api.kit.forhosting.com/health/rcri", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"high_risk_surgery": true,
"ischemic_heart_disease": true,
"heart_failure": false,
"cerebrovascular_disease": false,
"insulin_diabetes": false,
"creatinine_gt_2": false
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/rcri",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"high_risk_surgery": true,
"ischemic_heart_disease": true,
"heart_failure": false,
"cerebrovascular_disease": false,
"insulin_diabetes": false,
"creatinine_gt_2": false
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/rcri", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"high_risk_surgery":true,"ischemic_heart_disease":true,"heart_failure":false,"cerebrovascular_disease":false,"insulin_diabetes":false,"creatinine_gt_2":false}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"high_risk_surgery":true,"ischemic_heart_disease":true,"heart_failure":false,"cerebrovascular_disease":false,"insulin_diabetes":false,"creatinine_gt_2":false}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/rcri", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"high_risk_surgery": true,
"ischemic_heart_disease": true,
"heart_failure": false,
"cerebrovascular_disease": false,
"insulin_diabetes": false,
"creatinine_gt_2": false
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.rcri",
"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 factor must be a JSON boolean or a 0/1 value; a missing field or any other token fails with invalid_input and is not billed. Treat the JSON as a transparent arithmetic aid, not a diagnosis or a substitute for licensed clinical judgment about anesthesia, monitoring, or whether to proceed with an operation.
What the Revised Cardiac Risk Index measures and how Lee's six points work
This capability implements that published table exactly, with no hidden weights, so a hand-scored vignette and the JSON body can be compared line by line.
Input contract, validation, and the shape of a successful response
The strings 0, 1, true, and false are accepted as the same tokens when a form encodes checkboxes as text. Optional output keys are omitted rather than set to null. Send a JSON object with six required flags. The canonical names are high_risk_surgery, ischemic_heart_disease, heart_failure, cerebrovascular_disease, insulin_diabetes, and creatinine_gt_2; each must be a JSON boolean or a 0/1 value. Integer 1 and boolean true both count as present; integer 0 and boolean false count as absent. Aliases such as high_risk, ihd, cad, chf, congestive_heart_failure, cva, stroke, tia, insulin, diabetes_insulin, elevated_creatinine, and creatinine_over_2 are mapped onto the canonical names, but the response always echoes the canonical keys. A missing field, an empty string, null, or any other token—including yes, no, 2, 0.5, or a nested object—fails with invalid_input naming the field and stating that a boolean or 0/1 value was expected; those failures are not billed. On success the body returns score as an integer from 0 through 6, risk_class as a Roman numeral I through IV, a short risk_class_label, major_cardiac_event_pct from the Lee 1999 derivation band, the six echoed booleans, factors_present as the ordered list of canonical names that were true, and formula RCRI Lee 1999. 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 risk classes, where the calculator belongs, and what it does not decide
Do not cancel an operation, choose invasive monitoring, start or stop a beta blocker, or issue a cardiac-clearance letter 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 factor is not a boolean or 0/1?
The call fails with invalid_input naming the field. Every factor must be a JSON boolean or a 0/1 value; missing fields and tokens such as yes are rejected and are not billed.
What does the RCRI 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.