VO2 max calculator for runners
A 5 km finished in 25:00 means 200 metres per minute, and Jack Daniels' formula turns that speed and the race length into a VO2 max estimate in millilitres per kilogram per minute. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Distance
- 5
- Time
- 1,500
- Time min
- 25
- Time display
- 25:00
- Distance m
- 5,000
- Velocity m per min
- 200
Coaches, club captains, and training apps get a structured VO2 max in millilitres per kilogram per minute without a metabolic cart. Distance or finish time that is not strictly positive is rejected as invalid input because a zero or negative race cannot describe a completed effort.
What a Daniels race VO2 max estimate 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 protocols measure it with gas exchange on a treadmill, but runners already encode aerobic capacity in a completed race: a known distance and an honest finish time collapse into average velocity over a known duration.
Jack Daniels published a two-step field method that coaches still use for mixed-distance programmes: first compute the oxygen cost of running at that velocity from a quadratic in metres per minute, then divide by the fraction of VO2 max that the race duration typically supports, so a long marathon does not overstate capacity the way a raw velocity would.
Send required field distance as a positive finite number of kilometres (five for a 5K, ten for a 10K, 21.0975 for a half marathon, 42.195 for a marathon) and required field time as a positive finite number of finish-time seconds (twenty-five minutes is one thousand five hundred). Convert hours, minutes, and seconds on the client before you call.
How coaches use it, and its practical limits
Call the free in-browser VO2 max calculator for runners after a parkrun, a 10K, a half marathon, or a marathon so mixed-distance clubs share one Daniels estimate without rebuilding constants in a spreadsheet. Prefer chip or gun times in whole seconds; if your UI collects hours, minutes, and seconds, convert client-side before calling. Keep expectations clinical: this is an educational and planning field estimate from race velocity, not a diagnostic medical device, and athletes with health conditions should follow professional advice rather than any single formula alone.
Prefer this landing when you already know any recent race distance and finish time and only need VO2 max in millilitres per kilogram per minute from the Daniels formula.
What you can do with it
Club races of mixed distances
Coaches convert 5K, 10K, half-marathon, and marathon chip times into one Daniels VO2 max so mixed-distance squads share a single aerobic chart.
Training logs after a recent race
Apps that already store kilometres and finish seconds call this once to fill a deterministic VO2 max column without a metabolic test.
FAQ
How is VO2 max estimated from a race for runners?
Average velocity is race distance in metres divided by finish time in minutes. Daniels oxygen cost is −4.60 + 0.182258·v + 0.000104·v² (v in m/min).
What happens if distance or time is not positive?
Both distance (kilometres) and time (seconds) must be strictly positive finite numbers describing a completed race; zero or negative values are rejected and not charged.
What units should I use for distance and finish time?
Provide distance in kilometres and time as total finish seconds (for example distance 5 and time 1500 for a 25:00 5K).
Is this the same as the 5K-only VO2 max calculator or the Cooper test?
No. This landing accepts any recent race distance plus finish time using the Daniels formula. The five-kilometre-only calculator, Cooper twelve-minute distance, Rockport walk, and Astrand step test are different search intents and separate products.
What does the VO2 max calculator for runners cost?
The browser tool runs free on your device.
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/sports/vo2-max-runners \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"distance":5,"time":1500}'const res = await fetch("https://api.kit.forhosting.com/sports/vo2-max-runners", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"distance": 5,
"time": 1500
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/sports/vo2-max-runners",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"distance": 5,
"time": 1500
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/sports/vo2-max-runners", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"distance":5,"time":1500}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"distance":5,"time":1500}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/sports/vo2-max-runners", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"distance": 5,
"time": 1500
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "sports.vo2_max_runners",
"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.
Limits
max_distance | 1000000 |
max_time | 8640000 |
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
What a Daniels race VO2 max estimate measures and which inputs you need
Aliases dist, d, km, distance_km, and race_distance are accepted for kilometres; aliases time_seconds, finish_time, seconds, t, duration, and time_s are accepted for the clock. Identical inputs always yield identical JSON because the algorithm never touches the network, a model, a clock, or a random generator. Missing fields, non-finite values, and any distance or time that is not strictly positive fail with invalid_input and are not charged.
Reading the response fields, the formula, and the non-positive error
Distance_m is the same race in metres so you can chart SI units without re-converting. Velocity_m_per_min is the Daniels velocity v used in the oxygen-cost curve. Extremely slow combinations that drive oxygen cost non-positive are also rejected as outside the educational range of the Daniels curve. On success the response echoes distance in kilometres and time in seconds, plus time_min and a time_display clock string for logs. Field vo2_cost_ml_kg_min is the oxygen cost of running at that velocity: negative four point six zero plus zero point one eight two two five eight times v plus zero point zero zero zero one zero four times v squared. Fraction_vo2max is the duration-based share of VO2 max, and vo2_max is the estimated maximal oxygen uptake in millilitres per kilogram per minute—the primary result this landing exists to return. Unit is always ml/kg/min, formula restates the identity, and method is always daniels_race_formula so downstream code can branch without sniffing shapes. Distance or time that is zero or negative cannot describe a completed race and raises a clear invalid_input message naming the field and requiring a positive number. Do not confuse this endpoint with the five-kilometre-only VO2 max landing, Cooper twelve-minute distance, Rockport one-mile walk, or Astrand step-test: those are different search intents and live in separate products.
API usage, pricing, coaching workflows, and practical limits
Send a JSON body with required distance in kilometres and required time in finish-time seconds. Use the prepaid API when a coaching SaaS, 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 race-result import, then store vo2_max alongside date, course, and conditions for longitudinal aerobic charts.
Integration use cases
Coaching SaaS and sports-science homework
Courses and prepaid clients reuse the published Daniels constants instead of reimplementing oxygen-cost and duration-fraction maths in every language.