VO2 max Bruce treadmill protocol calculator
A man who lasts 12:30 on the Bruce treadmill protocol stops in stage 5 with an estimated VO2 max of 44.59375 mL/kg/min. Enter your total time and sex to turn a graded treadmill test into an aerobic fitness figure. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Time
- 12.5
- Sex
- Male
- Time min
- 12.5
- Time display
- 12:30
- Stage at stop
- 5
- Stages completed
- 4
The Bruce treadmill protocol is a graded exercise test that raises speed and grade every three minutes until the subject stops. Total time on the belt is a widely used proxy for cardiorespiratory fitness: exercise physiologists convert that duration into estimated maximal oxygen uptake with published sex-specific regressions. Non-positive or invalid time is rejected as invalid input because a zero or negative duration cannot describe a completed Bruce trial.
What the Bruce protocol measures and which inputs you need
VO2 max is the highest rate at which the body can take up and use oxygen during intense exercise, usually expressed in millilitres of oxygen per kilogram of body mass per minute. Laboratory carts measure it with gas exchange, but many clinics and sports programmes still use the Bruce multistage treadmill test because the protocol is standardised: each stage lasts three minutes while speed and incline increase until volitional fatigue or clinical stop criteria. The single best summary number from a completed trial is total time on the treadmill.
This calculator maps that time to estimated VO2 max with the classic sex-specific field regressions: for men, VO2 max equals fourteen point eight minus one point three seven nine times T plus zero point four five one times T squared minus zero point zero one two times T cubed; for women, VO2 max equals four point three eight times T minus three point nine, where T is minutes.
Required sex must be male or female so the correct regression is applied; numeric codes one and zero and short labels m and f are also accepted by the engine.
What you can do with it
Cardiac rehab and graded exercise test logs
Clinics record total Bruce treadmill time and convert it to estimated VO2 max with a stable Foster formula for visit notes and progress charts.
FAQ
What is the Bruce VO2 max formula?
For women, VO2 max is 4.38·T − 3.9. T is total Bruce treadmill time in minutes. This calculator applies the matching formula from the sex field.
What happens if time is zero or negative?
Time must be a positive value describing how long you completed on the Bruce protocol; non-positive time is rejected and not charged.
Do I need sex as well as time?
Yes. Sex selects the sex-specific regression (male Foster cubic vs female linear). Provide male or female; short codes m/f and 1/0 are also accepted by the engine.
Is the VO2 max Bruce treadmill protocol calculator free?
The browser tool runs free on your device.
Is this the same as laboratory VO2 max?
No. This is a field estimate from published Bruce time regressions, not gas-exchange VO2 peak from a metabolic cart. Use it for practical aerobic screening and education, not clinical diagnosis alone.
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/vo2max-bruce \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"time":12.5,"sex":"male"}'const res = await fetch("https://api.kit.forhosting.com/health/vo2max-bruce", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"time": 12.5,
"sex": "male"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/vo2max-bruce",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"time": 12.5,
"sex": "male"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/vo2max-bruce", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"time":12.5,"sex":"male"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"time":12.5,"sex":"male"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/vo2max-bruce", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"time": 12.5,
"sex": "male"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.vo2max_bruce",
"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 capability accepts total Bruce time in decimal minutes or a clock string, together with sex, applies the Foster cubic for men or the linear women formula, and returns structured JSON with VO2 max in millilitres per kilogram per minute, stage bookkeeping, and the formula used. The path is pure arithmetic with no network and no random seed, so clinics, sports labs, PE courses, and prepaid API clients get identical results every time.
What the Bruce protocol measures and which inputs you need
Send the required field time as a positive finite number of decimal minutes; aliases time_min, total_time, duration, t, and minutes are accepted, and M:SS or MM:SS clock strings are parsed into minutes. Identical inputs always yield identical JSON because the algorithm never touches the network, a model, a clock, or a random generator. Missing time or sex, non-finite values, unsupported sex labels, and non-positive time all fail with invalid_input and are not charged. Times above the isolate safety ceiling of thirty minutes are also rejected so the Worker stays bounded.
Reading the response fields and common treadmill-test pitfalls
Remember that the estimate assumes a standard Bruce protocol with accurate timing and a maximal or symptom-limited effort—handrail holding, early clinical stops, non-standard grade schedules, and pacing differences all bias the result, and this calculator does not correct for environment or medications. On success the response echoes time_min as decimal minutes and time_display as a readable M:SS string, the canonical sex label, stage_at_stop and stages_completed for the classic three-minute Bruce stages, and vo2max_ml_kg_min as the estimated maximal oxygen uptake. The unit_vo2max field is always ml/kg/min so user interfaces can label the number without hard-coding strings. The formula field restates the applied regression in human-readable form, formula_key is foster_cubic_men or linear_women for machine branching, and method is always bruce_treadmill_protocol so downstream code can distinguish this product from Cooper, Rockport, or heart-rate ratio estimates. Stage_at_stop is the Bruce stage number in which the trial stopped, capped at seven; stages_completed is how many full three-minute blocks finished before stop. Non-positive time is impossible for a completed trial and raises a clear invalid_input message that mentions non-positive time. Do not confuse this endpoint with age-sex percentile tables, Cooper twelve-minute distance formulas, or laboratory VO2 peak: those are different search intents and live in separate products when you need them.
API usage, pricing, clinical workflows, and practical limits
Call the free in-browser VO2 max Bruce treadmill protocol calculator for teaching labs, pre-participation screens, and quick coaching checks without building a spreadsheet of Foster constants. Prefer decimal minutes from the treadmill console; if your UI collects clock strings, pass them as time and the engine converts before applying the sex-specific formula. Keep expectations clinical: this is an educational and planning field estimate, not a diagnostic medical device, and people with cardiovascular symptoms should follow professional medical advice rather than any single formula alone. Send a JSON body with required time and required sex among male and female. Use the prepaid API when a cardiology practice system, sports-science notebook, school LMS, or training log needs a stable contract under KIT balance at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. Pair this endpoint with your own stress-test workflow, then store vo2max_ml_kg_min alongside date, medications, and stop reasons for longitudinal charts. Authors shipping SDKs can map vo2max_ml_kg_min directly into dashboards and export CSV columns labeled Bruce time and estimated VO2 max—the same numbers exercise physiologists compute by hand after a graded treadmill trial.
Integration use cases
Sports science labs and coaching software
Labs and apps that already store Bruce stop time call a prepaid endpoint for VO2 max instead of reimplementing sex-specific polynomials in every client.
Exercise physiology courses and homework checkers
Courses compare field estimates to lab VO2 peak and pin expected JSON in automated tests with deterministic Bruce outputs.