Percent VO2max from heart rate calculator
Training at 60% of your heart rate reserve corresponds to about 75.4% of VO2max. Enter your percent of heart rate reserve and get the matching share of maximal oxygen uptake for periodization tables and coursework. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Percent hrr
- 60
- Percent vo2max
- 75.4
- Slope
- 0.64
- Intercept
- 37
Coaches, sports-science students, and self-tracking athletes often know training intensity as a percentage of heart rate reserve but need the matching percentage of maximal oxygen uptake for lab worksheets, periodization tables, or research notes. This percent VO2max from heart rate calculator applies a fixed linear exercise-physiology estimate: percent VO2max equals zero point six four times percent heart rate reserve plus thirty-seven.
From heart rate reserve to oxygen uptake
Heart rate reserve is the gap between your maximal and resting heart rate, and percent of heart rate reserve is how much of that gap a session uses. It is the backbone of Karvonen-style intensity prescription. VO2max is the highest rate at which your body can take up and use oxygen, and percent VO2max tells you how close a session sits to that aerobic ceiling. Coaches, students and self-tracking athletes often know the first number but need the second for lab worksheets, periodization tables or research notes.
How the estimate works and when to use it
Exercise physiology has long linked the two percentages with simple straight-line equations that textbooks still teach. This calculator uses one of them: percent VO2max equals 0.64 times percent of heart rate reserve, plus 37. At 60% of reserve, that gives 75.4% of VO2max. The slope and intercept are fixed, so the same input always returns the same estimate. Treat the result as an educational estimate for planning and coursework, not as a measurement of your own oxygen uptake.
FAQ
Is percent HRR the same as percent of maximum heart rate?
No. Percent HRR is relative to heart rate reserve (max minus rest). Percent of HRmax ignores resting rate.
Is the percent VO2max from heart rate calculator free?
The browser tool runs free on your device.
How is this different from a VO2max field-test or VO2 reserve calculator?
Cooper, Rockport, and similar tools estimate absolute VO2max from a performance test. VO2 reserve is VO2max minus VO2rest.
How do I find my percent of heart rate reserve?
Heart rate reserve is the gap between your maximal and resting heart rate. Percent of reserve is the share of that gap your effort uses, the basis of Karvonen-style intensity zones. Enter that percentage here.
What values can I enter?
Any percentage above zero. The usual training range is roughly 1 to 100, and values above 200 are rejected because they fall outside any practical range for this estimate.
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/percent-vo2max-from-hr \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"percent_hrr":60}'const res = await fetch("https://api.kit.forhosting.com/health/percent-vo2max-from-hr", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"percent_hrr": 60
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/percent-vo2max-from-hr",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"percent_hrr": 60
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/percent-vo2max-from-hr", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"percent_hrr":60}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"percent_hrr":60}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/percent-vo2max-from-hr", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"percent_hrr": 60
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.percent_vo2max_from_hr",
"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
You send one positive number—percent of heart rate reserve—and receive structured JSON with the estimated percent VO2max, the echoed input, the slope and intercept used, the formula string, and a stable method label. The path is pure arithmetic with no network call, no language model, and no random seed, so homework checkers, prepaid API clients, and browser widgets always agree. Missing, non-finite, non-positive, or out-of-range inputs fail with invalid_input and are 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 the linear %HRR to %VO2max estimate measures and which input you need
Heart rate reserve, or HRR, is the gap between maximal and resting heart rate; percent HRR is the fraction of that gap used during a bout of work and is the backbone of Karvonen-style intensity prescription. Maximal oxygen uptake, VO2max, is the highest rate at which the body can take up and use oxygen; percent VO2max is how close a session sits to that aerobic ceiling. Exercise physiology research has long related those two percentages with simple linear regressions that coaches and textbooks still teach for classroom and field planning. Values above two hundred are rejected as outside a practical percentage range for this educational map. Use this when your search intent is specifically percent VO2max from percent heart rate, not target heart rate zones or oxygen uptake reserve in absolute units. This endpoint implements one widely cited fixed map: percent VO2max equals zero point six four times percent heart rate reserve plus thirty-seven. It does not compute heart rate reserve from age and resting rate, does not estimate VO2max from a Cooper or Rockport test, and does not convert absolute millilitres per kilogram per minute—it only maps an already-known percent HRR into an estimated percent VO2max. Send the required field percent_hrr as a positive finite number or numeric string, for example sixty for sixty percent of reserve. Accepted aliases include hrr_percent, percent_heart_rate_reserve, hrr_pct, pct_hrr, and heart_rate_reserve_percent. Values must be strictly greater than zero; zero and negative percentages fail with invalid_input. Identical inputs always yield identical JSON because the algorithm never touches the network, a model, a wall clock, or a random generator.
Reading the response fields and interpreting the estimate
Slope and intercept are included so audit logs and teaching demos can show the constants without hard-coding them on the client. Because the regression is linear and was fitted on population data, estimates near one hundred percent of reserve can slightly exceed one hundred percent VO2max; that is a known property of the published slope and intercept, not a software bug. Treat the output as an educational planning estimate, not a laboratory measurement from expired-gas analysis. 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 percent_hrr after stable rounding, then percent_vo2max as the linear estimate, slope fixed at zero point six four, intercept fixed at thirty-seven, formula restating the map in a printable string, and method always linear_hrr_to_vo2max so clients can branch without sniffing shapes. Use percent_vo2max when you only need the estimated intensity relative to maximal oxygen uptake for charts, exam answers, or session labels. Use the echoed percent_hrr when you want a single payload that documents what was computed without re-sending the request body. Do not confuse this endpoint with heart-rate zone calculators, Karvonen target heart rate tools, VO2max field-test estimators such as Cooper or Rockport, or VO2 reserve as max minus rest in millilitres per kilogram per minute: those answer different questions with different inputs and different SEO intents.
API usage, pricing, coaching workflows, and practical limits
Call the free in-browser percent VO2max from heart rate calculator for PE classes, sports-science labs, and quick athlete checks without reimplementing the linear map and validation in every spreadsheet. Prefer percentage points rather than fractions: send seventy for seventy percent, not zero point seven, unless you intentionally mean zero point seven percent of reserve, which is valid but unusually low for training bands. Practical bounds reject non-positive percentages and values above two hundred. 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 linear estimate alone. Send a JSON body with required percent_hrr in percentage points of heart rate reserve. 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 compute percent HRR from measured or estimated maximal and resting heart rates, call this endpoint for percent VO2max, then store both intensities beside session notes for moderate and vigorous aerobic work. Authors shipping SDKs can map percent_vo2max and percent_hrr into dashboards and export CSV columns for batch athlete files. When the required field is absent, the error message names percent_hrr so form UIs can highlight the control.
Integration use cases
Sports science homework and PE labs
Students convert a known percent of heart rate reserve into estimated percent VO2max and pin expected JSON in automated checkers with deterministic linear outputs.
Coaching apps and intensity tables
Training apps that already store %HRR for each session call one endpoint for matching %VO2max labels without reimplementing slope and intercept validation in each client.
Research pipelines and LMS backends
Server jobs that hold Karvonen-style intensities call a prepaid endpoint for the linear %VO2max estimate instead of duplicating edge-case checks in every language.
Technical questions
What formula converts percent heart rate reserve to percent VO2max?
This calculator uses the fixed linear map %VO2max = 0.64 × %HRR + 37. The response returns percent_vo2max, slope, intercept, and the formula string for auditability.
What happens if percent_hrr is missing, zero, or negative?
The request fails with invalid_input. percent_hrr must be a positive finite number (or numeric string). Validation failures are not charged.