Fat-burning zone calculator
At 30 years old with a resting pulse of 60, your fat-burning zone is 125–151 bpm: 50 to 70 percent of heart-rate reserve, a range you can read straight off a watch while walking, jogging or cycling. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Age
- 30
- Resting heart rate
- 60
- Hr max
- 190 bpm
- Hrr
- 130
- Intensity lo
- 50
- Intensity hi
- 70
The fat-burning heart rate zone is the moderate pulse band where a larger share of expended energy still comes from stored fat rather than from a high-intensity carbohydrate burn. Walkers, joggers, indoor cyclists, and cardio beginners usually want that band as a beats-per-minute range they can read on a watch, not as a five-zone coaching table and not as a single target at an intensity they have to pick. This calculator takes age as a positive integer and resting heart rate in beats per minute, estimates maximum heart rate with the Fox rule of two hundred twenty minus age, applies the Karvonen reserve method at fifty to seventy percent, and returns the lower and upper target pulses as integers.
What the fat-burning zone is and how Karvonen maps it to bpm
The fat-burning zone is the moderate heart-rate band in which a larger fraction of expended energy still comes from fat stores, as opposed to the high-intensity band where carbohydrate oxidation dominates the mix. Consumer coaches, cardio machines, and wearable watch faces label that band in beats per minute so a walker, cyclist, or treadmill user can stay inside it without a laboratory test or a metabolic cart.
This calculator does not measure your pulse, does not estimate calories, and does not diagnose how your body is fueling a given session; it applies a closed-form Karvonen identity to two numbers you already have. Age must be a positive whole number of years because the Fox maximum-heart-rate estimate is defined on integer age, not on a real-valued birthday fraction. Resting heart rate is the seated pulse in beats per minute, typically taken after several quiet minutes.
Maximum heart rate is estimated as two hundred twenty minus age. Heart-rate reserve is that ceiling minus resting heart rate. The fat-burning band is fifty to seventy percent of reserve, added back onto resting heart rate, then rounded to the nearest integer beat.
Those two bounds are the target range you would typically paint as easy-to-moderate cardio. The response also echoes the validated inputs, the estimated maximum, the reserve, the intensity percentages, the unit bpm, a method tag, and a formula string you can print next to the numbers. A resting pulse at or above the estimated maximum cannot produce a reserve and is rejected.
The engine is deterministic: the same pair of inputs always yields the same integer bounds, with no network, no sampling, and no clock. Treat the result as a training aid derived from population formulas, not as a medical diagnosis or a substitute for a graded exercise test.
Where a fat-burning zone calculator earns its keep
Walkers, joggers, and indoor-cycling beginners search for a fat-burning zone calculator because they want a beats-per-minute window they can hold for a steady session, not a five-zone coaching table and not a single Karvonen target at an intensity they still have to choose. A publisher ranking for that query is targeting people who already know their age and resting pulse and want the moderate band those two numbers imply under the reserve method.
Personal trainers can pre-fill session cards so a client stays in the fifty-to-seventy reserve window without doing the arithmetic on a phone calculator between sets. Classroom and coaching-certification courses that teach heart-rate reserve need an oracle that rejects non-integer age and still returns integer bpm bounds, because those two cases are how students confuse a formula demonstration with a medical measurement. Engineers writing fitness-app tests pin known-good pairs so a zone library cannot silently switch from reserve percentages to a raw percent of maximum without anyone noticing.
Failed validation does not consume balance.
What you can do with it
Steady cardio session cards
Enter age and resting heart rate to print a fifty-to-seventy percent reserve bpm window a client can hold on a walk, jog, or indoor-cycling session.
FAQ
How is the fat-burning heart rate zone calculated?
Maximum heart rate is 220 minus age. Heart-rate reserve is that ceiling minus resting heart rate. The zone is fifty to seventy percent of reserve added back onto resting heart rate, rounded to the nearest integer bpm.
Why must age be a positive integer?
The Fox estimate 220 minus age is defined on whole years of life.
Why do you need resting heart rate?
The Karvonen method uses heart-rate reserve, so the same age produces a lower fat-burn band when resting pulse is higher. Resting heart rate must sit strictly below 220 minus age.
What is the fat-burning zone for a 30-year-old?
With a resting pulse of 60, the estimated maximum is 190 and the reserve 130, so the zone runs from 125 to 151 beats per minute. A different resting pulse moves both ends, which is why it is asked for.
Is this the same as a five-zone chart or a maximum heart rate calculator?
No. It returns one moderate band, 50 to 70 percent of heart-rate reserve, as two whole numbers. It does not print a five-zone coaching table, estimate calories or diagnose how your body is fuelling a session.
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/fat-burning-zone \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":30,"resting_hr":60}'const res = await fetch("https://api.kit.forhosting.com/sports/fat-burning-zone", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 30,
"resting_hr": 60
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/sports/fat-burning-zone",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 30,
"resting_hr": 60
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/sports/fat-burning-zone", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":30,"resting_hr":60}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":30,"resting_hr":60}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/sports/fat-burning-zone", 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": 30,
"resting_hr": 60
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "sports.fat_burning_zone",
"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
min_age | 1 |
max_age | 120 |
min_resting_hr | 1e-12 |
max_resting_hr | 200 |
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
Successful calls are billed at $0.002; invalid input is not charged.
Input contract, response shape, and validation
Example: age thirty and resting sixty yield a maximum of one hundred ninety, a reserve of one hundred thirty, and a fat-burning band from one hundred twenty-five to one hundred fifty-one beats per minute. Prefer bare numbers over formatted strings; percent signs, bpm suffixes, and thousands separators are not parsed as input. POST a JSON body with two required fields. age is the subject's age in whole years and must be a positive integer from one through one hundred twenty; aliases years and age_years are accepted so a form, query string, or spreadsheet export does not need a rename step. Fractional ages, zero, negatives, empty strings, infinities, and non-numeric tokens fail with invalid_input naming age, because the published contract is a positive integer, not an approximate real. resting_hr is resting heart rate in beats per minute and must be a positive finite number within published limits, strictly less than the estimated maximum heart rate of two hundred twenty minus age. Aliases resting, rhr, rest_hr, resting_heart_rate, and hr_rest are accepted so a wearable export can reuse the same field without a mapping table. Each field may arrive as a JSON number or as a numeric string that parses cleanly. Missing fields, values outside limits, and a resting pulse that meets or exceeds the Fox ceiling fail with invalid_input and are not billed. On success the body echoes age and resting_hr, returns hr_max as two hundred twenty minus age, hrr as the reserve, intensity_lo and intensity_hi as fifty and seventy, bpm_lo and bpm_hi as the rounded Karvonen bounds, range as a copyable lower-upper string, unit as bpm, method as karvonen_fat_burn, and a formula restating the identity. Pricing for a successful item is a flat $0.002.
Where a fat-burning zone calculator earns its keep
Wearable and gym-kiosk prototypes can call the same contract from scripts to seed deterministic test vectors for a watch face that paints a green fat-burn band between bpm_lo and bpm_hi. This endpoint does not estimate calories burned, VO2 max, lactate threshold, Maffetone aerobic heart rate, or the other four training zones; pair it with those dedicated tools when you need them. Keep requests small, pin bpm_lo and bpm_hi in tests, and you get reproducible fat-burn arithmetic for widgets, coaching sheets, and edge workers without standing up a physiology lab of your own.
Integration use cases
Wearable and kiosk prototypes
Seed a watch face or gym kiosk with deterministic bpm_lo and bpm_hi so the painted fat-burn band matches the API and the free browser widget.
Coaching classes and unit tests
Check Karvonen homework and pin known-good pairs that reject non-integer age while returning integer fat-burn bounds for valid inputs.
Technical questions
Is this the same as a five-zone table or a max-heart-rate calculator?
No. This endpoint returns only the fat-burning bpm range. It does not emit the other training zones, a single intensity target, or a comparison of Fox, Tanaka, and Gulati ceilings.
What does the fat-burning zone calculator cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input is not billed.