API Reference
Derived Metrics
Full stats output — energy, recovery, drift, zones, MFI, and 60+ derived values.
When returnStats: true is set in the request, the result includes a stats object with the complete physiological profile. This requires demographic fields (weight, height, age, gender) in settings.
Overview
The stats object is organized into sections:
| Section | Key metrics |
|---|---|
thresholds | V0–V5 speed thresholds (m/s) |
energy | RMR, session calories, fat/carb oxidation, TEF, TDEE |
body | BMI, muscle %, fat % |
metabolic_factors | BF, AF, FF, ECF for continuous HR monitoring |
recovery | HR curve, time constants, EPOC, muscular recovery |
cardiac_drift | Drift magnitude, rate, metabolic debt |
training_load | 5-zone suffer score, oxidative/glycolytic partitioning |
hr_zones | 6 training zones (Z0–Z5) with HR boundaries |
metabolic_zones | 3 metabolic zones (MZ0–MZ2, slow domain) |
fiber_zones | 12 fiber zones (Z0–Z11) |
running / cycling / team_sports | Sport-specific outputs |
vo2max | Estimated VO2max |
mfi | Metabolic Fitness Index (0–5) |
rzi | Resting Zone Index (0–3) |
Speed thresholds
"thresholds": {
"Vi": 0.652,
"V0": 0.94, "V1": 1.59, "V2": 2.24,
"V3": 2.90, "V4": 3.55, "V5": 4.20
}
All values in m/s. These define the V-scale — the individual's physiological intensity axis.
- V0: Fat–carb crossover (Fatmax). Aligns with VT1/GET.
- V1: Aerobic threshold. Top of the fat-dominant zone.
- V2: Lactate threshold (LT2/VT2). The heavy-domain boundary.
- V2.5: Maximum aerobic speed. Coincides with HRmax.
- V5: Internal speed parameter (Vmax is derived from V5 and E).
Energy expenditure
"energy": {
"rmr_kcal_day": 1489,
"rmr_kcal_min": 1.03,
"rmr_o2_ml_kg_min": 2.86,
"resting_hr_bpm": 47,
"fat_max_oxidation_g_min": 0.56,
"fat_max_speed_mps": 1.59,
"base_fat_oxidation": 0.71,
"carb_oxidation_g_min": 3.20,
"carb_footprint_g_km": 19.2,
"fat_footprint_g_km": 2.0,
"cho_burn_rate_g_min": 0.25,
"session_calories": 320,
"tef_kcal_day": 194,
"tdee_kcal_day": 2129
}
Session calories uses the actual HR data from the session, converting each beat to kcal via the individualized Activity Factor.
Metabolic factors
"metabolic_factors": {
"basal_hr_bpm": 62.4,
"max_power_watts": 361,
"activity_factor": 10.68,
"base_factor": 4.76,
"food_factor": 1017.9,
"exercise_correction_factor": 1.067
}
These factors enable continuous all-day HR-to-calorie conversion:
- BF (base_factor): beats per kcal at rest
- AF (activity_factor): beats per kcal during exercise
- FF (food_factor): beats per kcal for post-meal thermogenesis (energy intake estimation)
Recovery kinetics
"recovery": {
"tau_base_s": 33.8,
"tau_response_s": 66.6,
"tau_debt_s": 1000.0,
"resting_hr_bpm": 48,
"hr_at_30s": 122,
"hr_at_60s": 104,
"hr_at_120s": 87,
"hr_at_300s": 77,
"time_to_hr_recovery_s": 780,
"muscular_recovery_hours": 11.0,
"epoc_fast_bpm": 56.0,
"epoc_slow_bpm": 30.7
}
Recovery HR curve is simulated from a 30-minute moderate exercise session. EPOC is partitioned into fast (alactacid: PCr resynthesis) and slow (lactacid: glycolytic debt clearance) components.
Cardiac drift
"cardiac_drift": {
"drift_end_bpm": 40.4,
"drift_pct": 21.8,
"drift_rate_bpm_min": 1.01,
"debt_end": 617353,
"metabolic_load": 617353
}
Computed from the session's speed data using the logarithmic debt model.
Training load
"training_load": {
"zone1": 3.82, "zone2": 4.43, "zone3": 2.35, "zone4": 0.0, "zone5": 0.0,
"total": 10.61,
"metabolic_load": 617353,
"hrd_oxidative": 8.25,
"hrd_glycolytic": 2.35,
"glycolytic_ratio": 0.222,
"load_tz": 12.96
}
Training load is partitioned into oxidative and glycolytic components. The glycolytic ratio indicates what fraction of the session's stress came from anaerobic metabolism. load_tz weights glycolytic stress 2x due to its higher physiological cost.
Zones
See dedicated pages: HR zones, Metabolic zones, fiber zones are in the fiber_zones array (12 zones, Z0–Z11).
Sport-specific
Set sport in settings to get sport-specific outputs. See: