Heart Rate Recovery Ratio Calculator
Divides your peak exercise heart rate by a later recovery reading: 180 bpm at the peak and 120 bpm afterwards give a ratio of 1.5. Handy for comparing repeated sessions that follow the same test routine. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Peak heart rate
- 180
- Recovery heart rate
- 120
- Recovery ratio
- 1.5
The heart rate recovery ratio compares your peak heart rate during exercise with a heart rate measured later in the recovery period. Enter both readings in beats per minute, and the calculator divides the peak value by the recovery value. The result is a compact, repeatable way to compare paired readings from the same exercise protocol. It does not diagnose fitness, illness, or cardiovascular health, because timing, activity, medication, temperature, posture, and measurement method can all influence the readings.
What the recovery ratio means
This calculator uses a direct formula: peak heart rate divided by recovery heart rate. A peak reading of 180 beats per minute and a later reading of 120 beats per minute produce a ratio of 1.5. A ratio above 1 means the later reading is lower than the peak, while a ratio of 1 means the readings are equal.
The number is dimensionless because both inputs use the same unit. That makes it convenient for comparing repeated sessions when the protocol is kept consistent. However, the ratio is not interchangeable with the more common heart rate recovery difference, which subtracts the later reading from the peak.
A ratio of 1.5 and a drop of 60 bpm describe the same example from different perspectives, but they should not be compared against thresholds intended for one-minute or two-minute heart rate recovery measured as a difference. Record the exercise type, recovery interval, posture, and device alongside the ratio so the figure retains its context. Without those details, a change may reflect a different test setup rather than a meaningful physiological change.
How to collect comparable readings
Measure the peak value near the hardest point of the exercise session, using a device and method you can repeat. Then choose a specific recovery interval, such as one or two minutes after stopping, and measure again at that exact interval. Keep the recovery conditions consistent: standing, sitting, walking slowly, and lying down can produce different responses.
The calculator accepts positive numeric readings up to 300 bpm and does not assume that the recovery reading must be lower. That choice keeps the arithmetic honest when a pulse rises briefly after exercise ends, but an unexpected increase deserves a check for timing or measurement error. Use the same heart-rate monitor when comparing sessions, make sure the sensor has reliable contact, and avoid mixing a momentary watch display with a manually counted average unless that is part of your protocol.
Enter beats per minute, not beats counted over a shorter interval. If you count for 15 seconds, multiply that count by four before entering it. Consistent collection matters more than extra decimal places because the ratio can only be as useful as the two readings behind it.
Using the result responsibly
Use the ratio as a descriptive calculation for a defined pair of readings, not as a diagnosis or universal fitness score. For personal tracking, compare results only when exercise intensity, recovery timing, environment, hydration, and posture are reasonably similar. Medication, illness, fatigue, heat, altitude, caffeine, and device error can change heart-rate behavior, so a single result should not be overinterpreted.
Coaches and researchers can include the ratio in a broader dataset, but they should preserve the raw peak and recovery values as well as the protocol. The output deliberately returns both inputs with the calculated ratio, making the record easier to audit. If you need the conventional recovery drop, calculate peak heart rate minus recovery heart rate or use a tool designed for that measure; clinical reference values often apply to that absolute difference rather than this ratio.
Seek qualified medical advice for symptoms, unusual responses, or decisions about exercise safety. Both paths use the same deterministic formula, so identical numeric inputs produce the same rounded result every time.
What you can do with it
Compare repeat exercise sessions
Track a dimensionless peak-to-recovery ratio when the workout, recovery interval, posture, and measurement method stay consistent.
Add a derived field to fitness data
Convert stored peak and recovery BPM readings into a deterministic ratio for reports, dashboards, or research tables.
Check a calculation quickly
Verify a manually calculated ratio without a spreadsheet while retaining both source readings in the result.
FAQ
What formula does the calculator use?
It divides peak heart rate by recovery heart rate and rounds the ratio to six decimal places.
What units should I enter?
Enter both readings in beats per minute. Because the units cancel during division, the resulting ratio has no unit.
Is this the same as heart rate recovery in bpm?
No. A recovery difference subtracts the later reading from the peak, while this capability divides the peak by the later reading.
Does a higher ratio always mean better fitness?
No. Timing, exercise protocol, posture, medication, environment, and measurement quality affect the readings, so the ratio is not a standalone clinical interpretation.
How do I take the two readings so sessions are comparable?
Measure the peak near the hardest point of the session, then measure again at a fixed interval, such as one or two minutes after stopping, in the same posture and with the same monitor. If you count for 15 seconds, multiply by four first.
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/heart-rate-recovery-ratio \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"peak_heart_rate":180,"recovery_heart_rate":120}'const res = await fetch("https://api.kit.forhosting.com/health/heart-rate-recovery-ratio", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"peak_heart_rate": 180,
"recovery_heart_rate": 120
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/heart-rate-recovery-ratio",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"peak_heart_rate": 180,
"recovery_heart_rate": 120
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/heart-rate-recovery-ratio", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"peak_heart_rate":180,"recovery_heart_rate":120}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"peak_heart_rate":180,"recovery_heart_rate":120}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/heart-rate-recovery-ratio", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"peak_heart_rate": 180,
"recovery_heart_rate": 120
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.heart_rate_recovery_ratio",
"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
Using the result responsibly
The browser calculator runs locally for convenient checks, while automated requests cost $0.002.
Technical questions
What happens when a required reading is missing?
The request returns an invalid_input error identifying the missing required field instead of producing a result.
How much does an API calculation cost?
Each successful API request costs $0.002; the same deterministic calculation is also available in the browser.