Tanaka max heart rate
At 40 years old the Tanaka equation puts your maximum heart rate at 180 bpm: 208 minus 0.7 times age, a research-based ceiling that falls more slowly with age than the folk rule of 220 minus age. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Age
- 40
- Max heart rate
- 180 bpm
- Precision
- 2
Maximum heart rate is the highest pulse, in beats per minute, that a typical athlete of a given age is expected to reach at all-out effort. Sports coaches use that ceiling to place easy endurance, tempo, and interval work on a percent-of-max scale when a laboratory test is not available. This calculator applies only the Tanaka equation: two hundred eight minus zero point seven times age in years. It returns a deterministic bpm value you can paste into a training log, a zone spreadsheet, or an automated coaching pipeline.
What Tanaka maximum heart rate means in sport
In sports science, maximum heart rate is the estimated peak pulse in beats per minute that an athlete of a given age is expected to hit at all-out effort. Coaches treat that ceiling as the one-hundred-percent mark when they sketch easy endurance, tempo, threshold, and interval work as percentages of max, especially when a graded exercise test is not on the calendar. This calculator uses the Tanaka formula only: two hundred eight minus zero point seven times chronological age in years.
The two thousand one Tanaka, Monahan, and Seals regression is widely cited in endurance coaching because it declines more slowly with age than the folk rule two hundred twenty minus age, which often underestimates older athletes and overestimates the very young. For a valid request the engine returns the parsed age, the Tanaka result in bpm, a unit field set to bpm, the method name tanaka, the rounding precision, and a formula string you can store beside a session so later staff know which model produced the ceiling.
It does not measure a wearable, does not mix Fox or Gulati estimates, and does not emit zone tables; those are separate sports tools that start after you already have a max. Age must be a strictly positive finite number because a zero or negative age is not a meaningful input to the regression. Treat the bpm figure as a population estimate, not a medical diagnosis: medications, heat, genetics, and altitude still move a true peak, so refine with field tests when championship work depends on the number.
Where sports programs, classrooms, and coaching software use Tanaka bpm
Running, cycling, rowing, and team-sport staff often start zone planning with an age-predicted ceiling before they refine with field tests, lactate work, or lab data, and the Tanaka regression is a common research-based choice when the simple two hundred twenty rule feels too coarse at older ages. Strength and conditioning blocks for academies can pre-fill a session sheet with a Tanaka max so percent-of-max targets are consistent across a squad that has not yet been tested.
Teachers and coaching-education courses can pre-generate answer keys for modest ages without trusting opaque apps that silently change coefficients or drop decimals. Developers call the same contract from scripts to seed deterministic test vectors for heart-rate zone UIs, to normalize user-entered ages before intensity demos, or to satisfy programming-challenge statements that demand the Tanaka HRmax formula rather than a multi-model average. Contest and certification practice sometimes needs a fast, offline source of bpm estimates so solutions can be checked without laboratory equipment.
Product and education tools use the estimate when a learner types an age and the UI must show a single textbook formula with a clear equation label.
What you can do with it
Endurance session planning
Estimate Tanaka HRmax from age so runners and cyclists can sketch percent-of-max intensity before a field test.
Squad and academy conditioning
Fill a team sheet with a reproducible bpm ceiling for each athlete age when laboratory max tests are not scheduled.
FAQ
How is maximum heart rate computed from age?
Send a positive finite age; optional precision (0–15, default 2) controls rounding.
What happens if age is zero, negative, or missing?
Age must be a positive number; non-positive, non-finite, and missing values are not valid for the Tanaka maximum heart rate equation and are not billed.
Is this the classic 220 minus age formula?
No. This sports calculator uses Tanaka only (208 − 0.7 × age). It does not mix Fox 220 − age or Gulati 206 − 0.88 × age; those live on multi-formula tools if you need a side-by-side comparison.
What does the max heart rate calculator cost?
It is free in your browser on this page.
Can I turn the result into training zones?
Yes, that is how coaches use it: the result is the 100 percent mark, and easy endurance, tempo, threshold and interval work are set as percentages of it. This page gives only the ceiling; zone tables are a separate step.
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/max-heart-rate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":40}'const res = await fetch("https://api.kit.forhosting.com/sports/max-heart-rate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 40
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/sports/max-heart-rate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 40
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/sports/max-heart-rate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":40}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":40}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/sports/max-heart-rate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"age": 40
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "sports.max_heart_rate",
"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
Age must be a strictly positive finite number; missing, zero, negative, or non-numeric input is rejected with invalid_input and is not billed. Successful API requests cost $0.002; the browser path stays free.
How age is read, how the formula runs, and how errors fail closed
Optional leading plus signs and scientific notation on age strings are allowed when they parse as finite decimals; embedded spaces, hex prefixes, and non-numeric tokens are rejected with a clear message so a bad cell does not become a wrong training ceiling. The preferred field is age in years. Aliases age_years, years, and a are accepted so spreadsheets, query strings, and typed forms can reuse the same contract without renaming columns. Age must be strictly positive: zero, negatives, missing values, empty strings, Infinity, and NaN fail with invalid_input because the Tanaka equation is not defined for non-positive age. An optional precision field, with aliases decimals and dp, chooses how many decimal places to expose for age and the bpm result, defaulting to two and capped at fifteen so JSON goldens stay stable across runtimes. Pair the free browser run on this page with the priced API when you need the identical mathematical result inside an automated pipeline without re-implementing the Tanaka regression yourself, and keep the formula string in the response when you document which model a dashboard used. Failed validation is not charged; only a successful finite bpm estimate consumes the published $0.002 item price.
Where sports programs, classrooms, and coaching software use Tanaka bpm
On this page the work runs entirely in your browser; through the API each successful lookup costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split — free interactive exploration and a priced, identical API — matches the rest of the KIT tier-A catalog and lets you move from a classroom demo to an automated pipeline without changing the mathematical result. Pair it with cycling zone, calorie, or other sports endpoints when you are building a small lab of free, deterministic fitness helpers, and always treat population formulas as estimates rather than medical diagnosis or a substitute for supervised exercise testing.
Integration use cases
Coaching software fixtures
Seed unit tests and training apps with stable Tanaka max heart rate outputs without re-implementing 208 − 0.7×age.
Technical questions
Can I turn the bpm result into training zones?
Yes, as a starting point: treat the returned max_heart_rate as 100 percent and scale easy, tempo, and interval work as percentages. This endpoint does not emit zone tables itself; it returns the Tanaka ceiling in bpm.