VO2 reserve calculator
With a VO2max of 50 mL/kg/min and a resting uptake of 3.5, your VO2 reserve is 46.5 mL/kg/min: the aerobic window above rest that training targets are built on. Enter both values in the same unit. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Vo2 max
- 50
- Vo2 rest
- 3.5
- Vo2 reserve
- 46.5
Oxygen uptake reserve, often written VO2R or VO2 reserve, is the gap between your maximal oxygen uptake and the oxygen you consume at rest. Coaches, exercise physiologists, and sports-science students use that gap to express training intensity as a fraction of usable aerobic capacity rather than a blunt percentage of VO2max alone.
What oxygen uptake reserve measures and which inputs you need
Maximal oxygen uptake, VO2max, is the highest rate at which the body can take up and use oxygen during intense exercise. Resting oxygen uptake, VO2rest, is the much smaller rate measured or assumed while sitting or lying quietly; a common educational default is about three point five millilitres per kilogram per minute, which equals one metabolic equivalent or MET. Oxygen uptake reserve is simply the difference: VO2R equals VO2max minus VO2rest.
That difference is the usable aerobic window above rest, analogous to how heart-rate reserve is the window between resting and maximal heart rate. Exercise prescriptions often target a percentage of VO2R, then add resting uptake back, so intensity scales with each person's true ceiling and baseline rather than ignoring rest. Relative units in millilitres per kilogram per minute are the usual classroom and lab convention; absolute litres per minute work only if both inputs share that absolute scale.
Where the reserve helps, and its limits
Call the free in-browser VO2 reserve calculator for PE classes, sports-science labs, and quick client checks without reimplementing subtraction and validation in every spreadsheet. Prefer consistent units: if VO2max is relative, keep VO2rest relative; mixing absolute and relative values produces a meaningless difference even if the numbers parse. Practical bounds reject values above two hundred millilitres per kilogram per minute as out of range for relative uptake, and reject non-positive maximal or negative resting rates.
When a required field is absent, the error message names the missing field so form UIs can highlight the control. Keep this product as a planning and learning tool, not a diagnostic medical device; people with cardiopulmonary conditions should follow professional advice rather than any single formula alone.
What you can do with it
Coaching apps and intensity tables
Training apps store VO2R once per athlete, then build percent-of-reserve intensity bands without reimplementing max-minus-rest validation in each client.
FAQ
What is the VO2 reserve formula?
Oxygen uptake reserve is VO2R = VO2max − VO2rest. Both values must use the same units; relative mL/kg/min is the usual convention.
What unit does the VO2 reserve calculator use?
The response labels unit as mL/kg/min for relative oxygen uptake. Absolute L/min works only if you send both inputs already on that absolute scale; the engine does not convert units.
Is the VO2 reserve calculator free?
The browser tool runs free on your device.
How is this different from a VO2max field-test calculator?
Cooper, Rockport, YMCA step, and beep-test tools estimate VO2max from a performance test.
How do I use VO2 reserve to set training intensity?
Pick a percentage of the reserve, multiply, then add resting uptake back. That way the target follows each person's real ceiling and baseline, the same idea as heart-rate reserve.
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/vo2-reserve \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vo2_max":50,"vo2_rest":3.5}'const res = await fetch("https://api.kit.forhosting.com/health/vo2-reserve", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vo2_max": 50,
"vo2_rest": 3.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/vo2-reserve",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vo2_max": 50,
"vo2_rest": 3.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/vo2-reserve", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vo2_max":50,"vo2_rest":3.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vo2_max":50,"vo2_rest":3.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/vo2-reserve", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"vo2_max": 50,
"vo2_rest": 3.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.vo2_reserve",
"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 VO2 reserve calculator accepts two numbers—maximal oxygen uptake and resting oxygen uptake—subtracts them, and returns structured JSON with the reserve, both inputs echoed, a stable unit label, and the textbook formula string. The path is pure arithmetic with no network call, no model, and no random seed, so homework checkers, prepaid API clients, and browser widgets always agree on the same difference. When required fields are missing, non-finite, inverted, or out of a practical range, the request fails with invalid_input and is not charged. The free browser tool runs on your device; the API path uses prepaid KIT balance at $0.002 per successful item when you need the same contract from servers and SDKs.
What oxygen uptake reserve measures and which inputs you need
This endpoint computes only the reserve itself; you supply both measured or estimated values in the same unit system. Send required fields vo2_max and vo2_rest as finite numbers or numeric strings. Aliases for maximal uptake include vo2max, maximal_vo2, vo2_maximal, max_vo2, and vo2_maximum. Aliases for resting uptake include vo2rest, resting_vo2, vo2_resting, rest_vo2, and vo2_resting_rate. Identical inputs always yield identical JSON because the algorithm never touches the network, a language model, a wall clock, or a random generator. Missing fields, empty strings, non-finite values, non-positive maximal uptake, negative resting uptake, values above a practical two-hundred millilitres per kilogram per minute ceiling, and resting uptake that meets or exceeds maximal uptake all fail with invalid_input and never consume prepaid balance.
Reading the response fields and interpreting VO2 reserve
Pair the reserve with your own intensity fraction if you prescribe target VO2 as VO2rest plus intensity times VO2R—that target step is outside this calculator and belongs in your coaching app or lab worksheet. Likewise, heart-rate reserve and Karvonen target heart rate are related pedagogical ideas but different search intents and different input contracts. Keep expectations educational: the calculator does not diagnose fitness, does not replace a graded exercise test, and does not decide medical clearance for exercise. On success the response echoes vo2_max and vo2_rest after stable rounding, then vo2_reserve as their difference, unit set to mL/kg/min for relative uptake, formula restating VO2R equals VO2max minus VO2rest, and method always oxygen_uptake_reserve so clients can branch without sniffing shapes. Use vo2_reserve when you only need the gap for intensity tables, charts, or exam answers. Use the echoed inputs when you want a single payload that documents what was computed without re-sending the request body. Do not confuse this endpoint with Cooper, Rockport, YMCA step, or beep-test VO2max estimators already in the catalogue: those estimate maximal uptake from a field test, whereas this tool assumes you already have VO2max and VO2rest and only computes reserve. If resting uptake equals or exceeds maximal uptake, the engine raises a clear invalid_input message that names both values, because reserve would be zero or negative and is not a meaningful training window.
API usage, pricing, coaching workflows, and practical limits
Send a JSON body with required vo2_max and vo2_rest in the same oxygen-uptake units. Use the prepaid API when a coaching SaaS, wearable companion, school LMS, or research pipeline needs a stable contract under KIT balance at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. Typical workflows measure or estimate VO2max from a lab test or a field estimator, assume or measure VO2rest, call this endpoint for VO2R, then store the reserve beside session intensity labels for moderate and vigorous aerobic work. Authors shipping SDKs can map vo2_reserve, vo2_max, and vo2_rest into dashboards and export CSV columns for batch athlete files.
Integration use cases
Sports science homework and PE labs
Students enter VO2max and VO2rest to compute oxygen uptake reserve and pin expected JSON in automated checkers with deterministic VO2R outputs.
Research pipelines and LMS backends
Server jobs that already hold lab or field VO2max values call a prepaid endpoint for reserve instead of duplicating edge-case checks in every language.
Technical questions
What happens if resting VO2 is missing or greater than maximal VO2?
The request fails with invalid_input. Both vo2_max and vo2_rest are required finite numbers, and resting uptake must be strictly below maximal uptake so reserve is positive. Validation failures are not charged.