Modified shock index calculator
A heart rate of 110 bpm over a mean arterial pressure of 93.33 mmHg gives a modified shock index just under 1.2. Enter both vital signs to get the ratio for a teaching case, an exam drill or a simulation. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Heart rate
- 110
- Mean arterial pressure
- 93.3333333333
- Modified shock index
- 1.1785714286 bpm/mmHg
The modified shock index is a simple bedside ratio used in emergency medicine teaching and physiology courses: heart rate in beats per minute divided by mean arterial pressure in millimetres of mercury. Unlike the classic shock index, which divides heart rate by systolic pressure alone, the modified form uses MAP so diastolic contribution is reflected in the denominator. Students, instructors, and product teams need a deterministic calculator that never invents a result from zero or negative vitals and never calls a remote model for a one-line quotient.
What the modified shock index is and how it differs from classic shock index
Shock indices compress two vital signs into a single dimensionless-style ratio so learners can compare relative tachycardia against perfusion pressure without juggling separate cuff and pulse numbers. The classic shock index is heart rate divided by systolic blood pressure. The modified shock index instead divides heart rate by mean arterial pressure, which itself is often estimated as systolic plus two times diastolic all divided by three.
Because MAP sits closer to the time-weighted arterial load than peak systolic alone, MSI can respond differently when diastolic pressure changes while systolic stays fixed. This capability implements only the final ratio: MSI equals heart rate over MAP. It does not recompute MAP from cuff pairs, does not apply age- or drug-specific thresholds, and does not classify shock stages.
Both inputs must be finite and strictly positive. Always frame outputs as educational estimates from the published ratio, not as a clinical diagnosis or a substitute for professional judgment, continuous monitoring, or local treatment protocols.
Where a modified shock index calculator earns its keep
Emergency-medicine and nursing training programs routinely ask learners to compute MSI from a given heart rate and MAP pair so they can compare it against classic shock index on the same case vignette. Exam-prep generators need a deterministic oracle that rejects zero MAP and negative vitals instead of silently emitting Infinity that a buggy grader might treat as success.
Product teams building educational wellness or simulation widgets want a documented HR-over-MAP path that clients can audit by hand rather than a black-box acuity score that mixes multiple risk models without disclosure. Research assistants preparing synthetic vital-sign datasets need stable MSI labels from known heart rate and MAP pairs without network calls or model drift.
If you later need MAP from systolic and diastolic, classic shock index from heart rate and systolic, pulse pressure, or heart-rate zones, treat those as separate search intents and landings rather than overloading this modified shock index calculator page. Always present results as educational estimates from the MSI ratio; clinical decisions require qualified professionals, continuous context, and protocols this tool does not collect.
What you can do with it
Classroom MSI answer keys
Generate modified shock index from textbook heart rate and MAP pairs so instructors and auto-graders share one transparent ground truth.
Emergency-medicine and nursing demos
Show HR ÷ MAP beside classic shock index on the same vignette without mixing multi-score acuity models on one landing.
FAQ
What is the modified shock index?
MSI is heart rate divided by mean arterial pressure: MSI = HR / MAP. It differs from classic shock index, which uses systolic pressure in the denominator instead of MAP.
What formula do you use?
Heart rate is treated as bpm and MAP as mmHg; the ratio is reported with unit bpm/mmHg.
What happens if heart rate or MAP is zero or negative?
Non-positive inputs are rejected rather than returning Infinity, NaN, or invented absolute values.
What does the modified shock index calculator cost?
The browser tool is free and runs locally.
How is the modified shock index different from the classic one?
The classic shock index divides heart rate by systolic pressure. The modified version divides it by mean arterial pressure instead, so a change in diastolic pressure shows up in the ratio even when the systolic number stays the same.
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/modified-shock-index \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"heart_rate":110,"mean_arterial_pressure":93.3333333333}'const res = await fetch("https://api.kit.forhosting.com/health/modified-shock-index", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"heart_rate": 110,
"mean_arterial_pressure": 93.3333333333
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/modified-shock-index",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"heart_rate": 110,
"mean_arterial_pressure": 93.3333333333
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/modified-shock-index", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"heart_rate":110,"mean_arterial_pressure":93.3333333333}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"heart_rate":110,"mean_arterial_pressure":93.3333333333}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/modified-shock-index", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"heart_rate": 110,
"mean_arterial_pressure": 93.3333333333
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.modified_shock_index",
"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
This tool accepts positive heart rate and positive MAP, returns the cleaned inputs alongside the MSI ratio, and fails with invalid_input when either value is missing, non-finite, or not strictly greater than zero.
What the modified shock index is and how it differs from classic shock index
A zero or negative heart rate cannot represent a usable pulse for this model, and a zero or negative MAP would make the division undefined or clinically meaningless, so those cases fail with invalid_input rather than returning Infinity, NaN, or an absolute-value workaround. The arithmetic is pure floating-point with no network calls, no random seeds, and no wall-clock timestamps, so identical heart rate and MAP pairs always yield identical JSON.
Input contract, response shape, and error behaviour
Send two required fields. Classic smoke checks include heart rate one hundred ten with MAP about ninety-three point three, which yields MSI slightly above one, and heart rate ninety with MAP one hundred, which yields MSI of zero point nine. If you only have systolic and diastolic readings, compute MAP first with a dedicated mean arterial pressure calculator, then pass that MAP here with the measured heart rate. Keep requests small, pin the cleaned ratio in tests, and you get reproducible modified shock index values without standing up clinical decision support of your own. The field heart_rate is the pulse in beats per minute and must be a finite number strictly greater than zero; aliases hr, pulse, beats_per_minute, and bpm are accepted. The field mean_arterial_pressure is the MAP in millimetres of mercury and must also be finite and strictly positive; aliases map, map_mmhg, mean_ap, and arterial_pressure are accepted. Missing fields, non-numeric strings, NaN, Infinity, zero, and negative values fail with invalid_input and are not charged. On success the response returns the cleaned heart_rate and mean_arterial_pressure, modified_shock_index as their quotient, unit set to bpm/mmHg, the formula string MSI equals heart_rate divided by mean_arterial_pressure, and method modified_shock_index. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where a modified shock index calculator earns its keep
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 vital-sign fixtures
Bulk-produce stable MSI labels for synthetic datasets and regression tests with hard invalid_input on non-positive heart rate or MAP.
Technical questions
How do I format the input?
Send heart_rate and mean_arterial_pressure as finite positive numbers (e.g. 110 and 93.33). Aliases hr/map, pulse, and bpm are also accepted.