{"calculator":{"slug":"pace-calculator","math":{"href":"https://www.tracktoolspro.com/api/calculators/pace-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":"arithmetic","implementationFiles":["lib/formulas/pace.ts","lib/calc-utils.ts","components/calculators/inline/utils/constants.js"],"equations":["p = totalSeconds / distanceMeters (seconds per meter); paces.per400m = 400*p; paces.per1k = 1000*p; paces.perMile = 1609.34*p.","For each split distance x, cumulativeTime = p*x; splitTime = current cumulativeTime - preceding cumulativeTime. Preserve the exact finish distance, including a partial interval.","Mounted time/distance modes invert the same relation: finish = paceSeconds*distanceMeters/paceUnitMeters; distance = totalSeconds*paceUnitMeters/paceSeconds.","Mounted training heuristic: T10k = totalSeconds*(10000/distanceMeters)^1.06; zone mile pace = (zoneFactor/283)*(T10k/6.22) - (T10k-1760)/85."],"inputUnits":{"totalSeconds":"s","distanceMeters":"m","splitMeters":"m","includeSplits":"boolean"},"outputUnits":{"/paces/*":"s per stated distance","/splits/*/distance":"m","/splits/*/splitTime":"s","/splits/*/cumulativeTime":"s","/splits/*/remainderMeters":"m","/splits/*/index":"dimensionless index/count"},"domain":["Positive time/distance for paces; otherwise paces=null. Split interval must be positive; nonfinite or >10000 full intervals returns no split rows. includeSplits=false returns []."],"rounding":["Raw IEEE-754 numbers; the mounted page formats clocks separately."],"assumptions":["Uses the entered values and the selected convention; this documentation does not strengthen existing validation."],"limitations":["Constant speed, not a race forecast. Training-zone factors are unvalidated coaching heuristics, not prescribed intensities. The legacy 1609.34m mile convention is retained."],"mountedPageNotes":["Milestones merge within <5m of existing split rows and are sorted; HTTP defaults omit milestones. Pace-band display retains Finish beyond its 30-mile checkpoint cap. Training zones and dated benchmark comparisons are mounted-page extras, not HTTP result fields."],"workedExamples":[{"input":{"totalSeconds":1200,"distanceMeters":5000,"splitMeters":1000},"expected":{"/paces/per400m":96,"/paces/per1k":240},"absoluteTolerance":1e-8,"note":"Illustrative canonical-handler result; not independent validation of an empirical model."}],"constantsAndTables":{"metersPerMile":1609.34,"trainingZoneFactors":{"recovery":436.5,"easy":393,"moderate":357,"tempo":321,"threshold":300,"cv":286,"aerobicPower":274,"vo2Max":265},"visibleTrainingZones":[{"id":"easy","label":"Easy","description":"Recovery runs","color":"success","factor":393},{"id":"moderate","label":"Moderate","description":"Steady state","color":"success","factor":357},{"id":"tempo","label":"Tempo","description":"Threshold effort","color":"warning","factor":321},{"id":"threshold","label":"Threshold","description":"Race simulation","color":"warning","factor":300},{"id":"cv","label":"CV","description":"10K effort","color":"error","factor":286},{"id":"vo2Max","label":"VO2max","description":"3K-5K effort","color":"error","factor":265}],"milestones":[{"meters":1609.34,"label":"1 Mile"},{"meters":3218.69,"label":"2 Mile"},{"meters":5000,"label":"5K"},{"meters":10000,"label":"10K"},{"meters":15000,"label":"15K"},{"meters":16093.4,"label":"10 Mile"},{"meters":20000,"label":"20K"},{"meters":21097.5,"label":"Half"},{"meters":25000,"label":"25K"},{"meters":30000,"label":"30K"},{"meters":32186.9,"label":"20 Mile"},{"meters":35000,"label":"35K"},{"meters":40000,"label":"40K"}],"trainingBaselineSeconds":283,"tenKConversionMiles":6.22,"trainingOffsetSeconds":1760,"trainingOffsetDivisor":85},"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/pace.ts","url":"https://github.com/wickthumb/track_tools_pro_marketing/blob/b5a8aca7b85361476e0321a08b7fa5f516fc9535/lib/formulas/pace.ts","note":"Primary implementation source for these equations/tables, not a claim of scientific calibration."},{"title":"lib/calc-utils.ts","url":"https://github.com/wickthumb/track_tools_pro_marketing/blob/b5a8aca7b85361476e0321a08b7fa5f516fc9535/lib/calc-utils.ts","note":"Primary implementation source for these equations/tables, not a claim of scientific calibration."},{"title":"components/calculators/inline/utils/constants.js","url":"https://github.com/wickthumb/track_tools_pro_marketing/blob/b5a8aca7b85361476e0321a08b7fa5f516fc9535/components/calculators/inline/utils/constants.js","note":"Primary implementation source for these equations/tables, not a claim of scientific calibration."}]},"annotations":{"readOnlyHint":true,"consequentialHint":false},"name":"Pace Calculator","description":"Use this free running pace calculator for track or road races. This track pace calculator accepts any distance, including 400m, 800m, or 1500m, and a finish time, then calculates race pace per 400m lap, kilometer, and mile.","category":"Pace & Time","method":"POST","endpoint":"/api/calculators/pace-calculator","page":"/calculators/pace-calculator","inputSchema":{"type":"object","required":["totalSeconds","distanceMeters"],"properties":{"totalSeconds":{"type":"number","description":"Race or workout total time in seconds.","minimum":0},"distanceMeters":{"type":"number","description":"Race or workout distance in meters.","minimum":0},"splitMeters":{"type":"number","description":"Optional split chart interval in meters.","minimum":0,"default":400},"includeSplits":{"type":"boolean","description":"Whether to return an even split table.","default":true}}},"example":{"totalSeconds":1200,"distanceMeters":5000,"splitMeters":1000}}}