Lactate threshold heart rate estimate
With a maximum heart rate of 190 bpm, the classic 85% rule puts your lactate threshold at 161.5 bpm. Enter your maximum, adjust the percentage if your coach uses another, and get a pulse target for threshold sessions. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Maximum heart rate
- 190
- Percent
- 85 bpm
- Lthr bpm
- 161.5
- Precision
- 1
- Default percent
- 85
This lactate threshold heart rate estimate calculator turns a known maximum heart rate into a practical lactate-threshold target by applying a fixed percentage of that maximum. Coaches, endurance athletes, and fitness educators often start zone planning with a rule of thumb such as eighty-five percent of HRmax before refining with field tests or lab lactate curves.
What lactate threshold heart rate means
During a steady effort, your blood lactate stays in balance until a certain intensity. Past that point it builds up faster than your body can clear it, and the pulse at which that happens is your lactate threshold heart rate. Measuring it properly takes a graded exercise test with blood samples. When that is not available, coaches and textbooks approximate it as a fixed share of maximum heart rate, most often 85%, so athletes can sketch tempo and threshold sessions before investing in lab work.
How to use the estimate well
The calculation is simple: your maximum heart rate times the percentage, divided by 100. A maximum of 190 bpm at 85% gives 161.5 bpm. The estimate is only as good as the maximum you enter, so use one you actually know, and keep it at or below 250 bpm. Treat the result as a starting point for zone planning and refine it later with field tests or a lab lactate curve. The calculator does not measure blood chemistry or watch your effort.
Where a fixed-percent LTHR estimate fits in training, teaching, and software
Teachers can pre-generate answer keys for modest heart-rate problems without trusting opaque apps that silently change defaults or drop decimals. Developers call the same contract from scripts to seed deterministic test vectors for training-zone UIs, to normalize user-entered maxima before intensity demos, or to satisfy programming-challenge statements that demand a percentage-of-max LTHR rather than a single hardcoded constant. Contest and certification practice sometimes needs a fast, offline source of threshold bpm estimates so solutions can be checked without laboratory equipment.
Product and education tools use the estimate when a learner types a maximum heart rate and the UI must show a clear threshold target with an adjustable percent control.
What you can do with it
Threshold session starting points
Convert a known maximum heart rate into an LTHR bpm target at a fixed percent so athletes can sketch tempo and threshold work before field testing.
Homework and coaching education
Generate reproducible percent-of-max answers for textbooks, quizzes, and labs that teach lactate threshold as a share of HRmax.
FAQ
What does the lactate threshold heart rate calculator cost?
It is free in your browser on this page.
Which formula is used?
The default percent is 85 when you omit the field. Results are rounded to the requested precision (default 1 decimal place).
Is this a lab measurement of my true lactate threshold?
No. This is a fixed-percentage coaching estimate from maximum heart rate alone. True individual thresholds vary; use supervised testing when precision matters for health or performance decisions.
What is my lactate threshold heart rate if my maximum is 190?
At the default 85%, it is 161.5 beats per minute. Multiply 190 by 85 and divide by 100. With a different percentage, the result changes in proportion.
Can I use a percentage other than 85%?
Yes. Any value from 1 to 100 works, so you can follow your coach's rule or your own field test. The result is rounded to one decimal unless you choose another number of decimals.
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/lactate-threshold-hr \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"max_hr":190}'const res = await fetch("https://api.kit.forhosting.com/health/lactate-threshold-hr", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"max_hr": 190
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/lactate-threshold-hr",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"max_hr": 190
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/lactate-threshold-hr", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"max_hr":190}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"max_hr":190}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/lactate-threshold-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
{
"max_hr": 190
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.lactate_threshold_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
The engine multiplies max_hr by percent over one hundred, rounds to a chosen precision, and returns structured bpm fields you can cite in a plan or assert in software. Everything is fully offline and deterministic: the same inputs always yield the same lthr_bpm, with no network calls, no sampling, and no date-dependent shortcuts.
What lactate threshold heart rate means and what the response contains
Lactate threshold heart rate is an estimate of the pulse in beats per minute at which blood lactate begins to accumulate faster than it can be cleared during steady effort. Trainers and textbooks often approximate that point as a fixed share of maximum heart rate when a full graded exercise test is unavailable, so athletes can sketch tempo and threshold sessions before investing in lab work. This calculator does not measure blood chemistry or watch a race effort; it applies the closed-form product LTHR equals max_hr times percent divided by one hundred and returns structured numbers you can cite or wire into software. For each successful request you get the validated max_hr, the percent used, lthr_bpm as the estimated threshold pulse, unit tagged as bpm, method as percent_of_max_hr, the precision applied for rounding, a formula string restating the product, and default_percent documenting the built-in eighty-five percent fallback. There is no wearable sync path and no random noise: the engine either builds a finite bpm estimate inside the supported ranges or rejects the input with invalid_input. Rejected cases include missing max_hr, non-finite values, non-positive maximum heart rates, max_hr above the documented ceiling, and percent values outside the inclusive one-to-one-hundred band.
How max_hr and percent are read and how results stay reproducible
Optional leading plus signs and scientific notation on numeric 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 threshold target. Percent must lie between one and one hundred inclusive so clients cannot request a negative or absurd overshoot without an explicit error. The preferred field is max_hr in beats per minute, but aliases max_heart_rate, hr_max, and hrm are accepted so spreadsheets, query strings, and typed forms can reuse the same contract. Maximum heart rate must be strictly positive and at most two hundred fifty bpm: zero, negative numbers, non-finite values, and values above the ceiling fail with invalid_input because they are not meaningful inputs for a percentage-of-max estimate. Optional percent, with aliases percentage, pct, and of_max, chooses the share of maximum heart rate to treat as threshold intensity; when omitted the engine uses eighty-five, a common coaching default for lactate threshold as a fraction of HRmax. Optional precision, with aliases decimals and dp, chooses how many decimal places to expose for max_hr, percent, and lthr_bpm, defaulting to one and capped at fifteen so JSON goldens stay stable. 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 percentage rule yourself.
Where a fixed-percent LTHR estimate fits in training, teaching, and software
Coaches and athletes often seed threshold sessions from a percentage of a known maximum before refining with twenty-minute field tests, ramp protocols, or laboratory lactate sampling, and seeing LTHR as a transparent product of max_hr and percent makes the assumption easy to audit. 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 maximum-heart-rate, Karvonen target, or zone endpoints when you are building a small lab of free, deterministic fitness helpers, and always treat percentage-of-max LTHR as a planning estimate rather than a medical diagnosis or a substitute for supervised testing.
Integration use cases
Deterministic software fixtures
Seed unit tests and training apps with stable LTHR outputs without re-implementing the percentage-of-max formula.
Technical questions
What happens if max_hr is zero or negative?
The input is rejected with invalid_input. Maximum heart rate must be a positive finite number within the supported ceiling; non-positive values are not valid for this estimate.
Can I change the percentage from the default 85?
Yes. Set percent (or aliases percentage, pct, of_max) to any value from 1 to 100 inclusive. Values outside that range are rejected with invalid_input.