{"calculator":{"slug":"heart-rate-zone-calculator","math":{"href":"https://www.tracktoolspro.com/api/calculators/heart-rate-zone-calculator","jsonPointer":"/calculator/math","version":"2026-10-21.1","implementationVersion":"b5a8aca7b85361476e0321a08b7fa5f516fc9535","scope":"Canonical HTTP function and documented corresponding mounted-form math. This is public inspectable documentation, not access control or independent empirical validation.","unitNotation":"Input paths use [] and *; output paths are JSON Pointers with * (one segment) and ** (descendants). Empty output path denotes scalar result. Units apply to numeric quantities or explicitly described numeric strings; labels/statuses/booleans are dimensionless. More specific units, including count/index exceptions, override broad patterns.","interfaceNotes":["HTTP input is described by the adjacent inputSchema. The original handlers may accept numeric strings; this metadata adds no validation.","Mounted forms accept displayed clock/unit strings and enforce their own limits. Mounted tools limit strings to 200 characters and numeric parts to magnitude 1000000. Do not assume mounted/API input interchangeability.","Some legacy extreme/invalid tuples can produce null/empty results or nonfinite numbers serialized as null. Those are unavailable answers, not exact numerical predictions. Per-calculator domain describes the intended mathematical inputs."],"kind":"percentage-model","implementationFiles":["lib/formulas/heart-rate.ts"],"equations":["maxHR: BPM=round(maxHR*pct/100). Karvonen: BPM=round(restingHR+(maxHR-restingHR)*pct/100). threshold: BPM=round(thresholdHR*pct/100).","Apply each selected canonical zone min/max percentage; shared endpoints are inclusive displayed boundaries, not a disjoint time-in-zone classifier."],"inputUnits":{"method":"enum/string (dimensionless)","maxHR":"bpm","restingHR":"bpm","thresholdHR":"bpm"},"outputUnits":{"/*/zone":"dimensionless index/count","/*/min":"%","/*/max":"%","/*/minBPM":"bpm","/*/maxBPM":"bpm"},"domain":["maxHR100..220; restingHR30..100 for Karvonen; thresholdHR100..200 for threshold. Invalid method inputs yield null."],"rounding":["Nearest whole bpm with Math.round."],"assumptions":["Uses the entered values and the selected convention; this documentation does not strengthen existing validation."],"limitations":["Conventional coaching bands, not measured lactate thresholds or individualized physiology. No weekly distribution recommendation."],"mountedPageNotes":[],"workedExamples":[{"input":{"method":"maxHR","maxHR":190},"expected":{"/0/minBPM":95,"/4/maxBPM":190},"absoluteTolerance":1e-8,"note":"Illustrative canonical-handler result; not independent validation of an empirical model."}],"constantsAndTables":{"zonePercentageTables":{"maxHR":[{"zone":1,"name":"Recovery","min":50,"max":60,"color":"#4CAF50","purpose":"Active recovery, warm-up"},{"zone":2,"name":"Aerobic Base","min":60,"max":70,"color":"#8BC34A","purpose":"Base building, fat burning"},{"zone":3,"name":"Tempo","min":70,"max":80,"color":"#FFC107","purpose":"Aerobic endurance"},{"zone":4,"name":"Threshold","min":80,"max":90,"color":"#FF9800","purpose":"Lactate threshold work"},{"zone":5,"name":"VO2 Max","min":90,"max":100,"color":"#F44336","purpose":"Maximum performance"}],"karvonen":[{"zone":1,"name":"Recovery","min":50,"max":60,"color":"#4CAF50","purpose":"Active recovery, warm-up"},{"zone":2,"name":"Aerobic Base","min":60,"max":70,"color":"#8BC34A","purpose":"Base building, endurance"},{"zone":3,"name":"Tempo","min":70,"max":80,"color":"#FFC107","purpose":"Aerobic fitness"},{"zone":4,"name":"Threshold","min":80,"max":90,"color":"#FF9800","purpose":"Lactate threshold"},{"zone":5,"name":"VO2 Max","min":90,"max":100,"color":"#F44336","purpose":"Maximum effort"}],"threshold":[{"zone":1,"name":"Recovery","min":65,"max":75,"color":"#4CAF50","purpose":"Easy running, recovery"},{"zone":2,"name":"Aerobic","min":75,"max":85,"color":"#8BC34A","purpose":"Base building"},{"zone":3,"name":"Tempo","min":85,"max":92,"color":"#FFC107","purpose":"Tempo runs, steady state"},{"zone":4,"name":"SubThreshold","min":92,"max":98,"color":"#FF9800","purpose":"Threshold workouts"},{"zone":5,"name":"VO2 Max","min":98,"max":105,"color":"#F44336","purpose":"Intervals, racing"}]}},"sources":[{"title":"Canonical HTTP binding at the documented implementation revision","url":"https://github.com/wickthumb/track_tools_pro_marketing/blob/b5a8aca7b85361476e0321a08b7fa5f516fc9535/lib/calculator-functions.ts","note":"Existing calculation handler; math metadata is additive."},{"title":"lib/formulas/heart-rate.ts","url":"https://github.com/wickthumb/track_tools_pro_marketing/blob/b5a8aca7b85361476e0321a08b7fa5f516fc9535/lib/formulas/heart-rate.ts","note":"Primary implementation source for these equations/tables, not a claim of scientific calibration."},{"title":"Karvonen et al., 1957","url":"https://pubmed.ncbi.nlm.nih.gov/13470504/","note":"Karvonen 1957 bibliographic reference. Does not establish the product five-zone cutoffs; no new full-text verification claim."}]},"annotations":{"readOnlyHint":true,"consequentialHint":false},"name":"Heart Rate Zone Calculator","description":"Calculate five heart rate bands in bpm using percentage of max HR, Karvonen heart rate reserve, or threshold percentages. These percentage-derived bands do not prescribe a weekly training distribution.","category":"Training & Fitness","method":"POST","endpoint":"/api/calculators/heart-rate-zone-calculator","page":"/calculators/heart-rate-zone-calculator","inputSchema":{"type":"object","required":["method"],"properties":{"method":{"type":"string","description":"Zone method.","enum":["maxHR","karvonen","threshold"],"default":"maxHR"},"maxHR":{"type":"integer","description":"Maximum heart rate in bpm.","minimum":100,"maximum":220},"restingHR":{"type":"integer","description":"Resting heart rate in bpm; required for Karvonen.","minimum":30,"maximum":100},"thresholdHR":{"type":"integer","description":"Threshold heart rate in bpm; required for threshold method.","minimum":100,"maximum":200}}},"example":{"method":"maxHR","maxHR":190}}}