{
  "site": "AI Fit Hub",
  "count": 57,
  "calculators": [
    {
      "calculator": "tdee-calculator",
      "title": "TDEE Calculator",
      "category": "Nutrition",
      "summary": "Estimate your daily energy expenditure with Mifflin-St Jeor + activity factors.",
      "run": "https://aifithub.io/api/run/tdee-calculator",
      "example": "https://aifithub.io/api/run/tdee-calculator?sex=male&age=30&weight_kg=80&height_cm=180&activity_level=moderate&body_fat_percent=0&training_days_per_week=0",
      "inputs": {
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Sex constant in the BMR equations."
        },
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 1,
          "maximum": 120,
          "description": "Age in years; the equations were built on adults."
        },
        "weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "height_cm": {
          "type": "number",
          "default": 180,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        },
        "activity_level": {
          "type": "string",
          "enum": [
            "sedentary",
            "light",
            "moderate",
            "very",
            "athlete"
          ],
          "default": "moderate",
          "description": "Activity factor: sedentary 1.2, light 1.375, moderate 1.55, very 1.725, athlete 1.9."
        },
        "body_fat_percent": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 69.9,
          "description": "Optional body fat in percent (20 = 20%); adds Katch-McArdle to the formula comparison. Omit or 0 if unknown."
        },
        "training_days_per_week": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 7,
          "description": "Optional training days per week (whole number 1–7) to split the weekly total into training-day and rest-day calories. Omit or 0 for no split."
        }
      },
      "page": "https://aifithub.io/tdee-calculator/",
      "contract": "https://aifithub.io/contracts/tdee-calculator.json"
    },
    {
      "calculator": "bmr-calculator",
      "title": "BMR Calculator",
      "category": "Nutrition",
      "summary": "Estimate basal metabolic rate and maintenance calories using Mifflin-St Jeor assumptions.",
      "run": "https://aifithub.io/api/run/bmr-calculator",
      "example": "https://aifithub.io/api/run/bmr-calculator?sex=male&age=30&weight_kg=78&height_cm=178&activity_level=moderate",
      "inputs": {
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Sex constant in Mifflin-St Jeor: +5 male, -161 female."
        },
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 1,
          "maximum": 120,
          "description": "Age in years; the equation was built on adults 19 to 78."
        },
        "weight_kg": {
          "type": "number",
          "default": 78,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "height_cm": {
          "type": "number",
          "default": 178,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        },
        "activity_level": {
          "type": "string",
          "enum": [
            "sedentary",
            "light",
            "moderate",
            "very",
            "athlete"
          ],
          "default": "moderate",
          "description": "Activity factor for maintenance: sedentary 1.2, light 1.375, moderate 1.55, very 1.725, athlete 1.9. Does not change BMR."
        }
      },
      "page": "https://aifithub.io/bmr-calculator/",
      "contract": "https://aifithub.io/contracts/bmr-calculator.json"
    },
    {
      "calculator": "macro-calculator",
      "title": "Macro Calculator",
      "category": "Nutrition",
      "summary": "Convert calorie targets into protein, carbs, and fat grams for your goal.",
      "run": "https://aifithub.io/api/run/macro-calculator",
      "example": "https://aifithub.io/api/run/macro-calculator?tdee=2400&calories=2400&weight_kg=80&goal=maintain&split=balanced",
      "inputs": {
        "tdee": {
          "type": "number",
          "default": 2400,
          "minimum": 1,
          "description": "Maintenance calories (TDEE), kcal/day. Alias: calories (used only when tdee is absent)."
        },
        "weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms (sets protein grams)."
        },
        "goal": {
          "type": "string",
          "enum": [
            "maintain",
            "cut",
            "bulk"
          ],
          "default": "maintain",
          "description": "maintain (protein 1.8 g/kg), cut (−15% calories, 2.2 g/kg) or bulk (+10%, 2.0 g/kg)."
        },
        "split": {
          "type": "string",
          "enum": [
            "balanced",
            "higher_carb",
            "higher_fat",
            "higher_protein"
          ],
          "default": "balanced",
          "description": "Share of the non-protein calories to carbs: balanced 50%, higher_carb 65%, higher_fat 40%, higher_protein 45% (and +0.3 g/kg protein)."
        },
        "calories": {
          "type": "number",
          "default": 2400,
          "minimum": 1,
          "description": "Older alias of tdee."
        }
      },
      "page": "https://aifithub.io/macro-calculator/",
      "contract": "https://aifithub.io/contracts/macro-calculator.json"
    },
    {
      "calculator": "bmi-calculator",
      "title": "BMI Calculator",
      "category": "Body Composition",
      "summary": "Calculate BMI quickly with a plain-language range explanation and limitations.",
      "run": "https://aifithub.io/api/run/bmi-calculator",
      "example": "https://aifithub.io/api/run/bmi-calculator?weight_kg=75&height_cm=175",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 75,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms (multiply pounds by 0.45359237)."
        },
        "height_cm": {
          "type": "number",
          "default": 175,
          "minimum": 30,
          "maximum": 275,
          "description": "Standing height in centimetres (multiply inches by 2.54)."
        }
      },
      "page": "https://aifithub.io/bmi-calculator/",
      "contract": "https://aifithub.io/contracts/bmi-calculator.json"
    },
    {
      "calculator": "calorie-deficit-calculator",
      "title": "Calorie Deficit Calculator",
      "category": "Planning",
      "summary": "Estimate required daily calorie deficit for a target timeline and bodyweight change.",
      "run": "https://aifithub.io/api/run/calorie-deficit-calculator",
      "example": "https://aifithub.io/api/run/calorie-deficit-calculator?tdee=2400&current_weight_kg=85&target_weight_kg=78&weeks=20&timeline_weeks=16",
      "inputs": {
        "tdee": {
          "type": "number",
          "default": 2400,
          "minimum": 1,
          "description": "Maintenance calories (total daily energy expenditure), kcal/day."
        },
        "current_weight_kg": {
          "type": "number",
          "default": 85,
          "minimum": 1,
          "maximum": 650,
          "description": "Current body weight, kg."
        },
        "target_weight_kg": {
          "type": "number",
          "default": 78,
          "minimum": 1,
          "maximum": 650,
          "description": "Goal body weight, kg. Above the current weight plans a surplus."
        },
        "weeks": {
          "type": "number",
          "default": 20,
          "minimum": 0.1,
          "description": "Timeline in weeks (alias: timeline_weeks). The projection lists up to 104 weeks."
        },
        "timeline_weeks": {
          "type": "number",
          "default": 16,
          "minimum": 0.1,
          "description": "Alias of weeks, used only when weeks is absent."
        }
      },
      "page": "https://aifithub.io/calorie-deficit-calculator/",
      "contract": "https://aifithub.io/contracts/calorie-deficit-calculator.json"
    },
    {
      "calculator": "body-recomposition-planner",
      "title": "Body Recomposition Planner",
      "category": "Planning",
      "summary": "Plan body-fat reduction pace, deficit targets, and protein needs around a timeline.",
      "run": "https://aifithub.io/api/run/body-recomposition-planner",
      "example": "https://aifithub.io/api/run/body-recomposition-planner?weight_kg=84&body_fat_percent=24&target_body_fat_percent=18&weeks=20&resistance_training_days=4",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 84,
          "minimum": 1,
          "maximum": 650,
          "description": "Current body weight in kilograms."
        },
        "body_fat_percent": {
          "type": "number",
          "default": 24,
          "minimum": 0.5,
          "maximum": 75,
          "description": "Current body fat in percent (24 = 24%)."
        },
        "target_body_fat_percent": {
          "type": "number",
          "default": 18,
          "minimum": 0.5,
          "maximum": 75,
          "description": "Target body fat in percent (18 = 18%). At or above the current value means no fat to lose."
        },
        "weeks": {
          "type": "number",
          "default": 20,
          "minimum": 1,
          "maximum": 260,
          "description": "Timeline in whole weeks."
        },
        "resistance_training_days": {
          "type": "number",
          "default": 4,
          "minimum": 0,
          "maximum": 7,
          "description": "Resistance-training sessions per week (whole number). Fewer than 2 adds a warning; it does not change the numbers."
        }
      },
      "page": "https://aifithub.io/body-recomposition-planner/",
      "contract": "https://aifithub.io/contracts/body-recomposition-planner.json"
    },
    {
      "calculator": "progressive-overload-planner",
      "title": "Progressive Overload Planner",
      "category": "Strength",
      "summary": "Project lifting progression with weekly overload and planned deload cycles.",
      "run": "https://aifithub.io/api/run/progressive-overload-planner",
      "example": "https://aifithub.io/api/run/progressive-overload-planner?current_lift_kg=100&weekly_increase_percent=1.5&training_weeks=16&deload_every_weeks=5&deload_drop_percent=8",
      "inputs": {
        "current_lift_kg": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Current working weight, kg."
        },
        "weekly_increase_percent": {
          "type": "number",
          "default": 1.5,
          "minimum": 0,
          "maximum": 100,
          "description": "Increase per training week as a percent (1.5 = 1.5%), compounding."
        },
        "training_weeks": {
          "type": "number",
          "default": 16,
          "minimum": 1,
          "maximum": 520,
          "description": "Block length in weeks (whole number)."
        },
        "deload_every_weeks": {
          "type": "number",
          "default": 5,
          "minimum": 0,
          "maximum": 520,
          "description": "Every nth week is a deload (whole number); 0 = no deloads."
        },
        "deload_drop_percent": {
          "type": "number",
          "default": 8,
          "minimum": 0,
          "maximum": 100,
          "description": "How much lighter a deload week is than the last training week, percent (8 = 8%)."
        }
      },
      "page": "https://aifithub.io/progressive-overload-planner/",
      "contract": "https://aifithub.io/contracts/progressive-overload-planner.json"
    },
    {
      "calculator": "one-rep-max-calculator",
      "title": "One-Rep Max Calculator",
      "category": "Strength",
      "summary": "Estimate one-rep max with Epley, Brzycki, and Lombardi formulas.",
      "run": "https://aifithub.io/api/run/one-rep-max-calculator",
      "example": "https://aifithub.io/api/run/one-rep-max-calculator?weight_kg=100&reps=5&lift_type=bench&lifted_kg=100",
      "inputs": {
        "lift_type": {
          "type": "string",
          "enum": [
            "bench",
            "squat",
            "deadlift",
            "ohp",
            "other"
          ],
          "default": "bench",
          "description": "Lift performed; labels the summary only."
        },
        "lifted_kg": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Alias of weight_kg (older name); weight_kg wins when both are given."
        },
        "reps": {
          "type": "number",
          "default": 5,
          "minimum": 1,
          "maximum": 20,
          "description": "Reps completed in that set (whole number). Most accurate at 2–10."
        },
        "weight_kg": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Weight lifted in the set, kg (multiply pounds by 0.45359237). Alias: lifted_kg."
        }
      },
      "page": "https://aifithub.io/one-rep-max-calculator/",
      "contract": "https://aifithub.io/contracts/one-rep-max-calculator.json"
    },
    {
      "calculator": "body-fat-percentage-calculator",
      "title": "Body Fat Percentage Calculator",
      "category": "Body Composition",
      "summary": "Estimate body fat percentage using the U.S. Navy circumference method.",
      "run": "https://aifithub.io/api/run/body-fat-percentage-calculator",
      "example": "https://aifithub.io/api/run/body-fat-percentage-calculator?sex=male&height_cm=175&neck_cm=38&waist_cm=85&hip_cm=96&weight_kg=80&age=30",
      "inputs": {
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Selects the men's (waist − neck) or women's (waist + hip − neck) Navy equation and the ACE category scale."
        },
        "height_cm": {
          "type": "number",
          "default": 175,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        },
        "neck_cm": {
          "type": "number",
          "default": 38,
          "minimum": 1,
          "description": "Neck circumference just below the larynx, cm."
        },
        "waist_cm": {
          "type": "number",
          "default": 85,
          "minimum": 1,
          "description": "Waist circumference, cm: at the navel for men, at the narrowest point for women. For men it must exceed neck_cm."
        },
        "hip_cm": {
          "type": "number",
          "default": 96,
          "minimum": 1,
          "description": "Hip circumference at the widest point, cm. Used in the women's equation only."
        },
        "weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight, kg, for fat and lean mass and the CUN-BAE cross-check (defaults to 80 when omitted, so pass the real weight)."
        },
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 1,
          "maximum": 120,
          "description": "Age in years, for the CUN-BAE cross-check only (built on adults 18 to 80; defaults to 30)."
        }
      },
      "page": "https://aifithub.io/body-fat-percentage-calculator/",
      "contract": "https://aifithub.io/contracts/body-fat-percentage-calculator.json"
    },
    {
      "calculator": "protein-intake-calculator",
      "title": "Protein Intake Calculator",
      "category": "Nutrition",
      "summary": "Get daily protein targets based on training level and goal.",
      "run": "https://aifithub.io/api/run/protein-intake-calculator",
      "example": "https://aifithub.io/api/run/protein-intake-calculator?weight_kg=75&activity_level=active&goal=maintain&is_plant_based=no&meals_per_day=4",
      "inputs": {
        "activity_level": {
          "type": "string",
          "enum": [
            "sedentary",
            "active",
            "athlete"
          ],
          "default": "active",
          "description": "Base range: sedentary 1.2–1.6, active 1.6–2.0, athlete 1.8–2.4 g/kg."
        },
        "goal": {
          "type": "string",
          "enum": [
            "maintain",
            "cut",
            "bulk"
          ],
          "default": "maintain",
          "description": "Adds to both ends of the range: cut +0.2 g/kg, bulk +0.1 g/kg, maintain 0."
        },
        "is_plant_based": {
          "type": "string",
          "enum": [
            "no",
            "yes"
          ],
          "default": "no",
          "description": "yes raises the range 10% for mostly plant protein."
        },
        "meals_per_day": {
          "type": "number",
          "default": 4,
          "minimum": 1,
          "maximum": 12,
          "description": "Meals the daily target is split across (whole number)."
        },
        "weight_kg": {
          "type": "number",
          "default": 75,
          "minimum": 0,
          "description": "Body weight, kg (multiply pounds by 0.45359237)."
        }
      },
      "page": "https://aifithub.io/protein-intake-calculator/",
      "contract": "https://aifithub.io/contracts/protein-intake-calculator.json"
    },
    {
      "calculator": "ideal-weight-calculator",
      "title": "Ideal Weight Calculator",
      "category": "Body Composition",
      "summary": "Compare Devine, Robinson, Miller, and Hamwi formulas as a realistic range.",
      "run": "https://aifithub.io/api/run/ideal-weight-calculator",
      "example": "https://aifithub.io/api/run/ideal-weight-calculator?sex=male&height_cm=175",
      "inputs": {
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Selects the men's or women's constants."
        },
        "height_cm": {
          "type": "number",
          "default": 175,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres (converted to inches; below 5 ft the 5 ft value is returned)."
        }
      },
      "page": "https://aifithub.io/ideal-weight-calculator/",
      "contract": "https://aifithub.io/contracts/ideal-weight-calculator.json"
    },
    {
      "calculator": "running-pace-calculator",
      "title": "Running Pace Calculator",
      "category": "Cardio",
      "summary": "Calculate pace per km and mile and project race finish times from one run.",
      "run": "https://aifithub.io/api/run/running-pace-calculator",
      "example": "https://aifithub.io/api/run/running-pace-calculator?distance_km=10&time_minutes=50",
      "inputs": {
        "distance_km": {
          "type": "number",
          "default": 10,
          "minimum": 0,
          "description": "Distance run, km (miles × 1.609344)."
        },
        "time_minutes": {
          "type": "number",
          "default": 50,
          "minimum": 0,
          "description": "Elapsed time in minutes (22:30 = 22.5)."
        }
      },
      "page": "https://aifithub.io/running-pace-calculator/",
      "contract": "https://aifithub.io/contracts/running-pace-calculator.json"
    },
    {
      "calculator": "heart-rate-zone-calculator",
      "title": "Heart Rate Zone Calculator",
      "category": "Recovery",
      "summary": "Calculate personalized training zones with the Karvonen method.",
      "run": "https://aifithub.io/api/run/heart-rate-zone-calculator",
      "example": "https://aifithub.io/api/run/heart-rate-zone-calculator?age=30&resting_hr=60&method=karvonen&max_hr_formula=fox&max_hr=0",
      "inputs": {
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 1,
          "maximum": 120,
          "description": "Age in years."
        },
        "resting_hr": {
          "type": "number",
          "default": 60,
          "minimum": 20,
          "maximum": 150,
          "description": "Resting heart rate, bpm (on waking)."
        },
        "method": {
          "type": "string",
          "enum": [
            "karvonen",
            "percent_max"
          ],
          "default": "karvonen",
          "description": "karvonen = resting + % × (max − resting); percent_max = % × max."
        },
        "max_hr_formula": {
          "type": "string",
          "enum": [
            "fox",
            "tanaka"
          ],
          "default": "fox",
          "description": "Age-based max HR when max_hr is not given: fox = 220 − age, tanaka = 208 − 0.7 × age."
        },
        "max_hr": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 250,
          "description": "Measured max heart rate, bpm; omit or 0 to estimate from age."
        }
      },
      "page": "https://aifithub.io/heart-rate-zone-calculator/",
      "contract": "https://aifithub.io/contracts/heart-rate-zone-calculator.json"
    },
    {
      "calculator": "water-intake-calculator",
      "title": "Water Intake Calculator",
      "category": "Nutrition",
      "summary": "Calculate daily water intake based on weight, activity level, and climate.",
      "run": "https://aifithub.io/api/run/water-intake-calculator",
      "example": "https://aifithub.io/api/run/water-intake-calculator?weight_kg=70&activity_level=moderate&climate=temperate",
      "inputs": {
        "activity_level": {
          "type": "string",
          "enum": [
            "sedentary",
            "light",
            "moderate",
            "heavy"
          ],
          "default": "moderate",
          "description": "Activity factor: sedentary 1.0, light 1.2, moderate 1.4, heavy 1.6."
        },
        "climate": {
          "type": "string",
          "enum": [
            "temperate",
            "hot",
            "humid"
          ],
          "default": "temperate",
          "description": "Climate factor: temperate 1.0, hot 1.1, humid 1.2."
        },
        "weight_kg": {
          "type": "number",
          "default": 70,
          "minimum": 0,
          "description": "Body weight, kg."
        }
      },
      "page": "https://aifithub.io/water-intake-calculator/",
      "contract": "https://aifithub.io/contracts/water-intake-calculator.json"
    },
    {
      "calculator": "waist-to-hip-ratio-calculator",
      "title": "Waist-to-Hip Ratio Calculator",
      "category": "Body Composition",
      "summary": "Calculate waist-to-hip ratio and assess body composition using WHO guidelines.",
      "run": "https://aifithub.io/api/run/waist-to-hip-ratio-calculator",
      "example": "https://aifithub.io/api/run/waist-to-hip-ratio-calculator?waist_cm=80&hip_cm=100&sex=male",
      "inputs": {
        "waist_cm": {
          "type": "number",
          "default": 80,
          "minimum": 0,
          "description": "Waist circumference, cm (midway between lowest rib and top of hip bone)."
        },
        "hip_cm": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Hip circumference at the widest part of the buttocks, cm."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Sets the WHO cut-off (0.90 men, 0.85 women)."
        }
      },
      "page": "https://aifithub.io/waist-to-hip-ratio-calculator/",
      "contract": "https://aifithub.io/contracts/waist-to-hip-ratio-calculator.json"
    },
    {
      "calculator": "sleep-calculator",
      "title": "Sleep Calculator",
      "category": "Recovery",
      "summary": "Calculate optimal bed and wake times based on 90-minute sleep cycles.",
      "run": "https://aifithub.io/api/run/sleep-calculator",
      "example": "https://aifithub.io/api/run/sleep-calculator?mode=wake-time&wake_time=06%3A30&fall_asleep_minutes=15",
      "inputs": {
        "mode": {
          "type": "string",
          "enum": [
            "wake-time",
            "bed-time"
          ],
          "default": "wake-time",
          "description": "wake-time: wake_time is when you get up, returns bedtimes; bed-time: wake_time is your bedtime, returns wake-up times."
        },
        "wake_time": {
          "type": "string",
          "default": "06:30",
          "description": "24-hour clock time \"HH:MM\" (the wake-up time, or the bedtime in bed-time mode)."
        },
        "fall_asleep_minutes": {
          "type": "number",
          "default": 15,
          "minimum": 1,
          "maximum": 60,
          "description": "Minutes it takes to fall asleep, added to time in bed."
        }
      },
      "page": "https://aifithub.io/sleep-calculator/",
      "contract": "https://aifithub.io/contracts/sleep-calculator.json"
    },
    {
      "calculator": "ffmi-calculator",
      "title": "FFMI Calculator",
      "category": "Body Composition",
      "summary": "Calculate Fat-Free Mass Index to gauge muscularity and compare against natural benchmarks.",
      "run": "https://aifithub.io/api/run/ffmi-calculator",
      "example": "https://aifithub.io/api/run/ffmi-calculator?weight_kg=80&height_cm=178&body_fat_pct=15",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "height_cm": {
          "type": "number",
          "default": 178,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        },
        "body_fat_pct": {
          "type": "number",
          "default": 15,
          "minimum": 0,
          "maximum": 99.9,
          "description": "Body fat in percent (15 = 15%)."
        }
      },
      "page": "https://aifithub.io/ffmi-calculator/",
      "contract": "https://aifithub.io/contracts/ffmi-calculator.json"
    },
    {
      "calculator": "vo2-max-estimator",
      "title": "VO2 Max Estimator",
      "category": "Cardio",
      "summary": "Estimate aerobic capacity with the Cooper 12-minute run or Rockport 1-mile walk field tests.",
      "run": "https://aifithub.io/api/run/vo2-max-estimator",
      "example": "https://aifithub.io/api/run/vo2-max-estimator?method=cooper&age=30&sex=male&distance_meters=2200&weight_kg=75&walk_time_minutes=15&heart_rate_after=140",
      "inputs": {
        "method": {
          "type": "string",
          "enum": [
            "cooper",
            "rockport"
          ],
          "default": "cooper",
          "description": "cooper: 12-minute run distance; rockport: one-mile walk time, finishing heart rate and body weight."
        },
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 15,
          "maximum": 100,
          "description": "Age in years; picks the norms row (and enters the Rockport formula)."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Sex; picks the norms table (and enters the Rockport formula)."
        },
        "weight_kg": {
          "type": "number",
          "default": 75,
          "minimum": 0,
          "description": "Body weight, kg."
        },
        "distance_meters": {
          "type": "number",
          "default": 2200,
          "minimum": 0,
          "description": "Distance covered in 12 minutes, metres."
        },
        "walk_time_minutes": {
          "type": "number",
          "default": 15,
          "minimum": 0,
          "description": "One-mile walk time in minutes (14:30 = 14.5)."
        },
        "heart_rate_after": {
          "type": "number",
          "default": 140,
          "minimum": 0,
          "description": "Heart rate at the end of the walk, bpm."
        }
      },
      "page": "https://aifithub.io/vo2-max-estimator/",
      "contract": "https://aifithub.io/contracts/vo2-max-estimator.json"
    },
    {
      "calculator": "strength-standards-calculator",
      "title": "Strength Standards Calculator",
      "category": "Strength",
      "summary": "Rank your lifts from Beginner to Elite based on bodyweight ratios.",
      "run": "https://aifithub.io/api/run/strength-standards-calculator",
      "example": "https://aifithub.io/api/run/strength-standards-calculator?body_weight_kg=80&sex=male&bench_kg=80&squat_kg=120&deadlift_kg=140&ohp_kg=50",
      "inputs": {
        "bench_kg": {
          "type": "number",
          "default": 80,
          "minimum": 0,
          "description": "Bench press 1RM, kg; 0 = not entered (skipped)."
        },
        "body_weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 0,
          "description": "Body weight, kg."
        },
        "deadlift_kg": {
          "type": "number",
          "default": 140,
          "minimum": 0,
          "description": "Deadlift 1RM, kg; 0 = not entered."
        },
        "ohp_kg": {
          "type": "number",
          "default": 50,
          "minimum": 0,
          "description": "Overhead press 1RM, kg; 0 = not entered."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Which threshold table to use."
        },
        "squat_kg": {
          "type": "number",
          "default": 120,
          "minimum": 0,
          "description": "Back squat 1RM, kg; 0 = not entered."
        }
      },
      "page": "https://aifithub.io/strength-standards-calculator/",
      "contract": "https://aifithub.io/contracts/strength-standards-calculator.json"
    },
    {
      "calculator": "dots-score-calculator",
      "title": "DOTS & Wilks Score Calculator",
      "category": "Strength",
      "summary": "DOTS & Wilks score calculator: compare powerlifting strength across weight classes with IPF DOTS and Wilks-2020 coefficients.",
      "run": "https://aifithub.io/api/run/dots-score-calculator",
      "example": "https://aifithub.io/api/run/dots-score-calculator?sex=male&bodyweight_kg=83&total_kg=500",
      "inputs": {
        "bodyweight_kg": {
          "type": "number",
          "default": 83,
          "minimum": 30,
          "maximum": 250,
          "description": "Bodyweight in kg (pounds × 0.45359237). DOTS is fitted for 40–210 kg men and 40–150 kg women; outside that the nearest edge is used."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Selects the men's or women's coefficients."
        },
        "total_kg": {
          "type": "number",
          "default": 500,
          "minimum": 0.1,
          "description": "Squat + bench + deadlift total in kg."
        }
      },
      "page": "https://aifithub.io/dots-score-calculator/",
      "contract": "https://aifithub.io/contracts/dots-score-calculator.json"
    },
    {
      "calculator": "lean-body-mass-calculator",
      "title": "Lean Body Mass Calculator",
      "category": "Body Composition",
      "summary": "Estimate lean body mass using Boer, James, and Hume formulas from height and weight.",
      "run": "https://aifithub.io/api/run/lean-body-mass-calculator",
      "example": "https://aifithub.io/api/run/lean-body-mass-calculator?sex=male&weight_kg=80&height_cm=178",
      "inputs": {
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Selects the men's or women's coefficients."
        },
        "weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "height_cm": {
          "type": "number",
          "default": 178,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        }
      },
      "page": "https://aifithub.io/lean-body-mass-calculator/",
      "contract": "https://aifithub.io/contracts/lean-body-mass-calculator.json"
    },
    {
      "calculator": "walking-calorie-calculator",
      "title": "Walking Calorie Calculator",
      "category": "Cardio",
      "summary": "Estimate calories burned from walking using speed, duration, body weight, and incline.",
      "run": "https://aifithub.io/api/run/walking-calorie-calculator",
      "example": "https://aifithub.io/api/run/walking-calorie-calculator?weight_kg=70&speed=moderate&duration_minutes=30&incline=flat",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 70,
          "minimum": 0,
          "description": "Body weight, kg."
        },
        "duration_minutes": {
          "type": "number",
          "default": 30,
          "minimum": 0,
          "description": "Walk duration, minutes."
        },
        "speed": {
          "type": "string",
          "enum": [
            "slow",
            "moderate",
            "brisk",
            "fast",
            "very-fast"
          ],
          "default": "moderate",
          "description": "Speed band: slow 2.0 mph (2.8 MET), moderate 3.0 mph (3.8), brisk 3.5 mph (4.8), fast 4.0 mph (5.5), very-fast 4.5 mph (7.0)."
        },
        "incline": {
          "type": "string",
          "enum": [
            "flat",
            "slight",
            "moderate",
            "steep"
          ],
          "default": "flat",
          "description": "Grade: flat 0%, slight 2%, moderate 5%, steep 10%."
        }
      },
      "page": "https://aifithub.io/walking-calorie-calculator/",
      "contract": "https://aifithub.io/contracts/walking-calorie-calculator.json"
    },
    {
      "calculator": "calories-burned-calculator",
      "title": "Calories Burned Calculator",
      "category": "Cardio",
      "summary": "Estimate exercise calorie burn from body weight, duration, MET intensity, and incline.",
      "run": "https://aifithub.io/api/run/calories-burned-calculator",
      "example": "https://aifithub.io/api/run/calories-burned-calculator?weight_kg=78&duration_minutes=45&activity_met=7.5",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 78,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "duration_minutes": {
          "type": "number",
          "default": 45,
          "minimum": 0.1,
          "maximum": 1440,
          "description": "Session length in minutes."
        },
        "activity_met": {
          "type": "number",
          "default": 7.5,
          "minimum": 0.5,
          "maximum": 30,
          "description": "Activity intensity in METs from the 2024 Adult Compendium of Physical Activities (1 = sitting at rest; walking 2.8-3.4 mph 3.8, running 6 mph 9.3, cycling general 7.0, vigorous weight training 6.0)."
        }
      },
      "page": "https://aifithub.io/calories-burned-calculator/",
      "contract": "https://aifithub.io/contracts/calories-burned-calculator.json"
    },
    {
      "calculator": "intermittent-fasting-window-planner",
      "title": "Intermittent Fasting Window Planner",
      "category": "Nutrition",
      "summary": "Plan protocol-based eating and fasting windows with a 24-hour timeline and 5:2 day picker.",
      "run": "https://aifithub.io/api/run/intermittent-fasting-window-planner",
      "example": "https://aifithub.io/api/run/intermittent-fasting-window-planner?protocol=16%3A8&first_meal_time=12%3A00&daily_calories=0",
      "inputs": {
        "protocol": {
          "type": "string",
          "enum": [
            "16:8",
            "18:6",
            "20:4",
            "14:10",
            "5:2",
            "OMAD"
          ],
          "default": "16:8",
          "description": "Fasting protocol; 5:2 is a weekly pattern of two low-calorie days, not a daily window."
        },
        "first_meal_time": {
          "type": "string",
          "default": "12:00",
          "description": "First meal time, \"HH:MM\" 24-hour or \"h:mm am/pm\" (e.g. \"12:00\" or \"1:30 pm\")."
        },
        "fast_days": {
          "type": "array",
          "description": "5:2 low-calorie days: two weekday names (Monday…Sunday) as a JSON array or comma list; missing days are filled from Monday and Thursday."
        },
        "daily_calories": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "description": "Optional daily calories, kcal; splits them across the meals, and sets the 5:2 low-day target at a quarter of them. 0 = no split."
        }
      },
      "page": "https://aifithub.io/intermittent-fasting-window-planner/",
      "contract": "https://aifithub.io/contracts/intermittent-fasting-window-planner.json"
    },
    {
      "calculator": "creatine-intake-calculator",
      "title": "Creatine Intake Calculator",
      "category": "Nutrition",
      "summary": "Estimate creatine maintenance and loading doses from body weight and training frequency.",
      "run": "https://aifithub.io/api/run/creatine-intake-calculator",
      "example": "https://aifithub.io/api/run/creatine-intake-calculator?body_weight_kg=82&protocol=maintenance&loading_phase_days=7",
      "inputs": {
        "body_weight_kg": {
          "type": "number",
          "default": 82,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "protocol": {
          "type": "string",
          "enum": [
            "maintenance",
            "loading"
          ],
          "default": "maintenance",
          "description": "maintenance = the maintenance dose every day; loading = 0.3 g/kg/day for the loading days, then maintenance."
        },
        "loading_phase_days": {
          "type": "number",
          "default": 7,
          "minimum": 0,
          "maximum": 30,
          "description": "Loading days (whole number, usually 5 to 7)."
        }
      },
      "page": "https://aifithub.io/creatine-intake-calculator/",
      "contract": "https://aifithub.io/contracts/creatine-intake-calculator.json"
    },
    {
      "calculator": "workout-volume-calculator",
      "title": "Workout Volume Calculator",
      "category": "Strength",
      "summary": "Calculate total training volume and compare against optimal ranges per muscle group.",
      "run": "https://aifithub.io/api/run/workout-volume-calculator",
      "example": "https://aifithub.io/api/run/workout-volume-calculator?exercises=%5B%7B%22name%22%3A%22Bench+Press%22%2C%22muscle_group%22%3A%22chest%22%2C%22sets%22%3A4%2C%22reps%22%3A8%2C%22weight%22%3A185%7D%2C%7B%22name%22%3A%22Incline+DB+Press%22%2C%22muscle_group%22%3A%22chest%22%2C%22sets%22%3A3%2C%22reps%22%3A10%2C%22weight%22%3A60%7D%2C%7B%22name%22%3A%22Cable+Fly%22%2C%22muscle_group%22%3A%22chest%22%2C%22sets%22%3A3%2C%22reps%22%3A12%2C%22weight%22%3A30%7D%5D&sets=4&reps=8&weight_kg=80&muscle_group=chest",
      "inputs": {
        "exercises": {
          "type": "array",
          "default": [
            {
              "name": "Bench Press",
              "muscle_group": "chest",
              "sets": 4,
              "reps": 8,
              "weight": 185
            },
            {
              "name": "Incline DB Press",
              "muscle_group": "chest",
              "sets": 3,
              "reps": 10,
              "weight": 60
            },
            {
              "name": "Cable Fly",
              "muscle_group": "chest",
              "sets": 3,
              "reps": 12,
              "weight": 30
            }
          ],
          "description": "The week's exercises as a JSON array: [{ name, muscle_group, sets (working sets across the week), reps, weight (kg; 0 = bodyweight) }]. Omit to use the single-exercise params below."
        },
        "muscle_group": {
          "type": "string",
          "enum": [
            "chest",
            "back",
            "shoulders",
            "biceps",
            "triceps",
            "quads",
            "hamstrings",
            "glutes",
            "calves",
            "abs"
          ],
          "default": "chest",
          "description": "Muscle group the exercise counts toward."
        },
        "reps": {
          "type": "number",
          "default": 8,
          "minimum": 0,
          "description": "Reps per set."
        },
        "sets": {
          "type": "number",
          "default": 4,
          "minimum": 0,
          "description": "Working sets a week of one exercise."
        },
        "weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 0,
          "description": "Weight per set, kg (0 = bodyweight)."
        }
      },
      "page": "https://aifithub.io/workout-volume-calculator/",
      "contract": "https://aifithub.io/contracts/workout-volume-calculator.json"
    },
    {
      "calculator": "food-to-exercise-converter",
      "title": "Food-to-Exercise Converter",
      "category": "Nutrition",
      "summary": "See how long you need to exercise to burn off any food, personalized by bodyweight.",
      "run": "https://aifithub.io/api/run/food-to-exercise-converter",
      "example": "https://aifithub.io/api/run/food-to-exercise-converter?calories=285&weight_kg=70&food_name=Pizza+slice",
      "inputs": {
        "calories": {
          "type": "number",
          "default": 285,
          "minimum": 1,
          "description": "Food energy to burn, kcal."
        },
        "weight_kg": {
          "type": "number",
          "default": 70,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "food_name": {
          "type": "string",
          "default": "Pizza slice",
          "description": "Optional label echoed back as foodName; does not change any number."
        }
      },
      "page": "https://aifithub.io/food-to-exercise-converter/",
      "contract": "https://aifithub.io/contracts/food-to-exercise-converter.json"
    },
    {
      "calculator": "resting-heart-rate-calculator",
      "title": "Resting Heart Rate Calculator",
      "category": "Cardio",
      "summary": "Assess cardiovascular fitness from your resting heart rate — how it rates for your age and sex, and the reading that rates Good.",
      "run": "https://aifithub.io/api/run/resting-heart-rate-calculator",
      "example": "https://aifithub.io/api/run/resting-heart-rate-calculator?rhr=62&age=35&sex=male",
      "inputs": {
        "rhr": {
          "type": "number",
          "default": 62,
          "minimum": 20,
          "maximum": 220,
          "description": "Resting heart rate, beats per minute (measured on waking)."
        },
        "age": {
          "type": "number",
          "default": 35,
          "minimum": 18,
          "maximum": 110,
          "description": "Age in years; adult reference data (ages 18-19 use the 16-19 row)."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female",
            "other"
          ],
          "default": "male",
          "description": "Chart column; other uses the male column."
        }
      },
      "page": "https://aifithub.io/resting-heart-rate-calculator/",
      "contract": "https://aifithub.io/contracts/resting-heart-rate-calculator.json"
    },
    {
      "calculator": "race-time-predictor",
      "title": "Race Time Predictor",
      "category": "Cardio",
      "summary": "Race Time predictor: predict finish times across 5K, 10K, half marathon, and marathon from any known race result using Riegel's formula.",
      "run": "https://aifithub.io/api/run/race-time-predictor",
      "example": "https://aifithub.io/api/run/race-time-predictor?known_distance_km=10&known_time_minutes=50",
      "inputs": {
        "known_distance_km": {
          "type": "number",
          "default": 10,
          "minimum": 0,
          "description": "Distance of the race you ran, km (5K = 5, half = 21.0975, marathon = 42.195; 1 mile = 1.609344)."
        },
        "known_time_minutes": {
          "type": "number",
          "default": 50,
          "minimum": 0,
          "description": "Finish time of that race in minutes (22:30 = 22.5)."
        },
        "target_distances_km": {
          "type": "array",
          "description": "Distances to predict, km: JSON array or comma-separated list, e.g. [5,10,21.0975,42.195]."
        }
      },
      "page": "https://aifithub.io/race-time-predictor/",
      "contract": "https://aifithub.io/contracts/race-time-predictor.json"
    },
    {
      "calculator": "cycling-power-ftp-zone-calculator",
      "title": "Cycling Power & FTP Zone Calculator",
      "category": "Cardio",
      "summary": "Calculate your 7 Coggan power training zones from FTP or a 20-minute test result with W/kg ratio.",
      "run": "https://aifithub.io/api/run/cycling-power-ftp-zone-calculator",
      "example": "https://aifithub.io/api/run/cycling-power-ftp-zone-calculator?ftp=250&weight_kg=75",
      "inputs": {
        "input_mode": {
          "type": "string",
          "enum": [
            "ftp",
            "test20"
          ],
          "description": "ftp = use the ftp value; test20 = FTP is 95% of test_power_20_min. Omitted: a given ftp wins, then a given test_power_20_min."
        },
        "ftp": {
          "type": "number",
          "default": 250,
          "minimum": 1,
          "description": "Functional threshold power, watts (default 250)."
        },
        "test_power_20_min": {
          "type": "number",
          "minimum": 1,
          "description": "Best 20-minute average power, watts (default 263)."
        },
        "weight_kg": {
          "type": "number",
          "default": 75,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms, for W/kg only; the zones depend on FTP alone."
        }
      },
      "page": "https://aifithub.io/cycling-power-ftp-zone-calculator/",
      "contract": "https://aifithub.io/contracts/cycling-power-ftp-zone-calculator.json"
    },
    {
      "calculator": "plate-loading-calculator",
      "title": "Plate Loading Calculator",
      "category": "Strength",
      "summary": "Calculate which weight plates to load on each side of a barbell to hit your target weight in kg or lbs.",
      "run": "https://aifithub.io/api/run/plate-loading-calculator",
      "example": "https://aifithub.io/api/run/plate-loading-calculator?target_weight=100&bar_weight=20&unit=kg",
      "inputs": {
        "available_plates": {
          "type": "array",
          "description": "Plate sizes available (assumes enough of each): JSON array or comma-separated list, e.g. [25,20,15,10,5,2.5,1.25]. Omitted: the standard set for the unit."
        },
        "bar_weight": {
          "type": "number",
          "default": 20,
          "minimum": 0,
          "description": "Weight of the empty bar. Omitted: 20 for unit=kg, 45 for unit=lbs."
        },
        "target_weight": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Total weight wanted on the bar, bar included, in the same unit as bar_weight and the plates."
        },
        "unit": {
          "type": "string",
          "enum": [
            "kg",
            "lbs"
          ],
          "default": "kg",
          "description": "Unit of all weights; picks the default bar and plate set (kg: 20 kg bar, 25–1.25 kg plates; lbs: 45 lb bar, 45–2.5 lb plates)."
        }
      },
      "page": "https://aifithub.io/plate-loading-calculator/",
      "contract": "https://aifithub.io/contracts/plate-loading-calculator.json"
    },
    {
      "calculator": "treadmill-pace-converter",
      "title": "Treadmill Pace Converter",
      "category": "Cardio",
      "summary": "Convert treadmill speed to running pace with incline-adjusted flat equivalent, projected race times, and calorie estimates.",
      "run": "https://aifithub.io/api/run/treadmill-pace-converter",
      "example": "https://aifithub.io/api/run/treadmill-pace-converter?speed_kph=10&incline_pct=1&weight_kg=75&session_by=time&duration_minutes=30&distance_km=5",
      "inputs": {
        "speed_kph": {
          "type": "number",
          "default": 10,
          "minimum": 0,
          "description": "Belt speed, km/h (mph × 1.609344)."
        },
        "incline_pct": {
          "type": "number",
          "default": 1,
          "minimum": 0,
          "maximum": 100,
          "description": "Belt incline as a percent grade (1 = 1%)."
        },
        "weight_kg": {
          "type": "number",
          "default": 75,
          "minimum": 0,
          "description": "Body weight for calories, kg."
        },
        "session_by": {
          "type": "string",
          "enum": [
            "time",
            "distance"
          ],
          "default": "time",
          "description": "Size the session by time (duration_minutes → distance) or distance (distance_km → time). Omitted: distance when only distance_km is given, else time."
        },
        "duration_minutes": {
          "type": "number",
          "default": 30,
          "minimum": 0,
          "description": "Session length in minutes (default 30)."
        },
        "distance_km": {
          "type": "number",
          "default": 5,
          "minimum": 0,
          "description": "Session distance in km (default 5)."
        }
      },
      "page": "https://aifithub.io/treadmill-pace-converter/",
      "contract": "https://aifithub.io/contracts/treadmill-pace-converter.json"
    },
    {
      "calculator": "flexibility-score-calculator",
      "title": "Flexibility Score Calculator",
      "category": "Body Composition",
      "summary": "Estimate your flexibility percentile and rating from a sit-and-reach test score, adjusted for age and sex.",
      "run": "https://aifithub.io/api/run/flexibility-score-calculator",
      "example": "https://aifithub.io/api/run/flexibility-score-calculator?reach_cm=30&age=30&sex=male",
      "inputs": {
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 10,
          "maximum": 90,
          "description": "Age in years; norms cover 15–69 (younger and older use the nearest group)."
        },
        "reach_cm": {
          "type": "number",
          "default": 30,
          "minimum": 0,
          "maximum": 70,
          "description": "Sit-and-reach score on the CPAFLA box scale, cm: feet at the 26 cm mark, so touching the toes = 26 (8 cm short of the toes = 18)."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female",
            "other"
          ],
          "default": "male",
          "description": "Selects the women's or men's norms; other uses the average of both."
        }
      },
      "page": "https://aifithub.io/flexibility-score-calculator/",
      "contract": "https://aifithub.io/contracts/flexibility-score-calculator.json"
    },
    {
      "calculator": "swim-pace-calculator",
      "title": "Swim Pace Calculator",
      "category": "Cardio",
      "summary": "Calculate swim pace, total time, or distance with SWOLF and effort-zone context.",
      "run": "https://aifithub.io/api/run/swim-pace-calculator",
      "example": "https://aifithub.io/api/run/swim-pace-calculator?mode=pace&stroke_type=freestyle&distance_value=1500&distance_unit=m&laps=0&pool_length=25&pool_length_unit=m&time_seconds=1800&target_pace_seconds=120&target_pace_unit=100m",
      "inputs": {
        "mode": {
          "type": "string",
          "enum": [
            "pace",
            "time",
            "distance"
          ],
          "default": "pace",
          "description": "pace: distance + time → pace; time: distance + target pace → time; distance: time + target pace → distance."
        },
        "stroke_type": {
          "type": "string",
          "enum": [
            "freestyle",
            "backstroke",
            "breaststroke",
            "butterfly",
            "im"
          ],
          "default": "freestyle",
          "description": "Stroke; only changes the SWOLF estimate (assumed strokes per 25 m)."
        },
        "distance_value": {
          "type": "number",
          "default": 1500,
          "minimum": 0,
          "description": "Distance in distance_unit (default 1500)."
        },
        "distance_unit": {
          "type": "string",
          "enum": [
            "m",
            "yd"
          ],
          "default": "m",
          "description": "Unit of distance_value; also the default pool_length_unit."
        },
        "laps": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "description": "Optional: number of pool lengths; with pool_length it replaces distance_value."
        },
        "pool_length": {
          "type": "number",
          "default": 25,
          "minimum": 0,
          "description": "Pool length in pool_length_unit (default 25); used for laps and the SWOLF estimate."
        },
        "pool_length_unit": {
          "type": "string",
          "enum": [
            "m",
            "yd"
          ],
          "default": "m",
          "description": "Unit of pool_length (defaults to distance_unit)."
        },
        "time_seconds": {
          "type": "number",
          "default": 1800,
          "minimum": 0,
          "description": "Total swim time in seconds (default 1800)."
        },
        "target_pace_seconds": {
          "type": "number",
          "default": 120,
          "minimum": 0,
          "description": "Pace in seconds per 100 of target_pace_unit (default 120)."
        },
        "target_pace_unit": {
          "type": "string",
          "enum": [
            "100m",
            "100yd"
          ],
          "default": "100m",
          "description": "Unit of target_pace_seconds."
        }
      },
      "page": "https://aifithub.io/swim-pace-calculator/",
      "contract": "https://aifithub.io/contracts/swim-pace-calculator.json"
    },
    {
      "calculator": "run-training-paces-calculator",
      "title": "Run Training Paces Calculator",
      "category": "Cardio",
      "summary": "Get personalized Easy, Tempo, Threshold, Interval, and Speed training paces from a recent race time using the Daniels VDOT method.",
      "run": "https://aifithub.io/api/run/run-training-paces-calculator",
      "example": "https://aifithub.io/api/run/run-training-paces-calculator?distance=5k&race_time_minutes=25&race_time_seconds=0",
      "inputs": {
        "distance": {
          "type": "string",
          "enum": [
            "1500m",
            "1mile",
            "5k",
            "10k",
            "half",
            "marathon"
          ],
          "default": "5k",
          "description": "Race the time is for (1mile = 1,609.344 m, half = 21,097.5 m)."
        },
        "race_time_minutes": {
          "type": "number",
          "default": 25,
          "minimum": 0,
          "description": "Whole minutes of the finish time (a 1:40:00 half = 100)."
        },
        "race_time_seconds": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "description": "Remaining seconds of the finish time, 0–59."
        }
      },
      "page": "https://aifithub.io/run-training-paces-calculator/",
      "contract": "https://aifithub.io/contracts/run-training-paces-calculator.json"
    },
    {
      "calculator": "sweat-rate-calculator",
      "title": "Sweat Rate Calculator",
      "category": "Recovery",
      "summary": "Calculate your personal sweat rate from pre/post-exercise weigh-ins and estimate fluid and sodium losses using ACSM guidelines.",
      "run": "https://aifithub.io/api/run/sweat-rate-calculator",
      "example": "https://aifithub.io/api/run/sweat-rate-calculator?pre_weight_kg=70&post_weight_kg=69.2&duration_minutes=60&fluid_consumed_ml=500&urine_produced_ml=0",
      "inputs": {
        "duration_minutes": {
          "type": "number",
          "default": 60,
          "minimum": 0,
          "description": "Exercise duration, minutes."
        },
        "fluid_consumed_ml": {
          "type": "number",
          "default": 500,
          "minimum": 0,
          "description": "Fluid drunk during exercise, mL."
        },
        "post_weight_kg": {
          "type": "number",
          "default": 69.2,
          "minimum": 0,
          "description": "Body weight right after exercise, kg."
        },
        "pre_weight_kg": {
          "type": "number",
          "default": 70,
          "minimum": 0,
          "description": "Body weight right before exercise, kg (nude, same scale)."
        },
        "urine_produced_ml": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "description": "Urine passed during exercise, mL (usually 0)."
        }
      },
      "page": "https://aifithub.io/sweat-rate-calculator/",
      "contract": "https://aifithub.io/contracts/sweat-rate-calculator.json"
    },
    {
      "calculator": "zone-2-heart-rate-calculator",
      "title": "Zone 2 Heart Rate Calculator",
      "category": "Cardio",
      "summary": "Calculate your Zone 2 heart rate with Maffetone, Karvonen, % Max HR, and lactate threshold methods compared side by side.",
      "run": "https://aifithub.io/api/run/zone-2-heart-rate-calculator",
      "example": "https://aifithub.io/api/run/zone-2-heart-rate-calculator?age=30&resting_hr=0&max_hr=0&max_hr_formula=fox&maffetone_adjustment=0&methods=%5B%22maffetone%22%2C%22percentage%22%2C%22karvonen%22%2C%22lactate%22%5D",
      "inputs": {
        "age": {
          "type": "number",
          "default": 30,
          "minimum": 16,
          "maximum": 90,
          "description": "Age in years (adult formulas)."
        },
        "resting_hr": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 120,
          "description": "Resting heart rate on waking, bpm; omit or 0 if unknown (Karvonen then returns zeros with requiresRhr = true)."
        },
        "max_hr": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 230,
          "description": "Measured max heart rate, bpm; omit or 0 to estimate from age with max_hr_formula. Values 1–99 are rejected."
        },
        "max_hr_formula": {
          "type": "string",
          "enum": [
            "fox",
            "tanaka"
          ],
          "default": "fox",
          "description": "Age-based max HR when max_hr is not given: fox = 220 − age, tanaka = 208 − 0.7 × age. Maffetone uses neither."
        },
        "maffetone_adjustment": {
          "type": "number",
          "enum": [
            "-10",
            "-5",
            "0",
            "5"
          ],
          "default": 0,
          "description": "Maffetone's correction to 180 − age: -10 recovering from major illness or on regular medication, -5 injured/regressing/often ill/returning, 0 training consistently, 5 two or more years progressing without those problems. Changes only the Maffetone method and mafHr."
        },
        "methods": {
          "type": "array",
          "enum": [
            "maffetone",
            "percentage",
            "karvonen",
            "lactate"
          ],
          "default": [
            "maffetone",
            "percentage",
            "karvonen",
            "lactate"
          ],
          "description": "Methods to return, JSON array or comma-separated list of maffetone, percentage, karvonen, lactate. Default: all four (as on the page)."
        }
      },
      "page": "https://aifithub.io/zone-2-heart-rate-calculator/",
      "contract": "https://aifithub.io/contracts/zone-2-heart-rate-calculator.json"
    },
    {
      "calculator": "dots-wilks-gl-combined-calculator",
      "title": "DOTS vs Wilks vs GL Calculator",
      "category": "Strength",
      "summary": "Compare DOTS, Wilks, and Goodlift scores side by side to see which system rates your powerlifting total highest.",
      "run": "https://aifithub.io/api/run/dots-wilks-gl-combined-calculator",
      "example": "https://aifithub.io/api/run/dots-wilks-gl-combined-calculator?sex=male&bodyweight_kg=83&total_kg=500&equipped=false",
      "inputs": {
        "bodyweight_kg": {
          "type": "number",
          "default": 83,
          "minimum": 30,
          "maximum": 250,
          "description": "Bodyweight in kg (pounds × 0.45359237)."
        },
        "equipped": {
          "type": "string",
          "enum": [
            "true",
            "false"
          ],
          "default": "false",
          "description": "true for equipped (single- or multi-ply) lifting, false for raw/classic. Changes IPF GL only."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Selects the men's or women's coefficients."
        },
        "total_kg": {
          "type": "number",
          "default": 500,
          "minimum": 0.1,
          "description": "Squat + bench + deadlift total in kg."
        }
      },
      "page": "https://aifithub.io/dots-wilks-gl-combined-calculator/",
      "contract": "https://aifithub.io/contracts/dots-wilks-gl-combined-calculator.json"
    },
    {
      "calculator": "rpe-to-percentage-converter",
      "title": "RPE to Percentage Converter",
      "category": "Strength",
      "summary": "Convert RPE and reps to percentage of 1RM with a full interactive RPE chart based on the Tuchscherer table.",
      "run": "https://aifithub.io/api/run/rpe-to-percentage-converter",
      "example": "https://aifithub.io/api/run/rpe-to-percentage-converter?rpe=8&reps=5&one_rm=0",
      "inputs": {
        "one_rm": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "description": "Known one-rep max, kg. 0 or omitted = not given (percentage only)."
        },
        "reps": {
          "type": "number",
          "default": 5,
          "minimum": 1,
          "maximum": 12,
          "description": "Reps in the set, whole number."
        },
        "rpe": {
          "type": "number",
          "default": 8,
          "minimum": 6,
          "maximum": 10,
          "description": "Rating of perceived exertion, 6–10; snapped to the nearest 0.5 (10 = no reps left, 8 = two left)."
        }
      },
      "page": "https://aifithub.io/rpe-to-percentage-converter/",
      "contract": "https://aifithub.io/contracts/rpe-to-percentage-converter.json"
    },
    {
      "calculator": "strength-percentile-calculator",
      "title": "Strength Percentile Calculator",
      "category": "Strength",
      "summary": "Find out where your squat, bench, deadlift, or OHP ranks against other lifters by bodyweight and sex.",
      "run": "https://aifithub.io/api/run/strength-percentile-calculator",
      "example": "https://aifithub.io/api/run/strength-percentile-calculator?sex=male&body_weight_kg=80&lift=squat&weight_lifted=100&reps=1",
      "inputs": {
        "body_weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 0,
          "description": "Body weight, kg."
        },
        "lift": {
          "type": "string",
          "enum": [
            "squat",
            "bench",
            "deadlift",
            "ohp"
          ],
          "default": "squat",
          "description": "Lift assessed (ohp = standing overhead press)."
        },
        "reps": {
          "type": "number",
          "default": 1,
          "minimum": 1,
          "maximum": 30,
          "description": "Reps in that set (whole number); above 1 the 1RM is estimated with Epley."
        },
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "Which threshold table to use."
        },
        "weight_lifted": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Weight lifted in the set, kg."
        }
      },
      "page": "https://aifithub.io/strength-percentile-calculator/",
      "contract": "https://aifithub.io/contracts/strength-percentile-calculator.json"
    },
    {
      "calculator": "meet-day-attempt-selector",
      "title": "Meet Day Attempt Selector",
      "category": "Strength",
      "summary": "Plan powerlifting meet attempts with opener, second, and third attempt suggestions based on 1RM and confidence.",
      "run": "https://aifithub.io/api/run/meet-day-attempt-selector",
      "example": "https://aifithub.io/api/run/meet-day-attempt-selector?squat_1rm=180&bench_1rm=120&deadlift_1rm=200&squat_confidence=moderate&bench_confidence=moderate&deadlift_confidence=moderate",
      "inputs": {
        "bench_1rm": {
          "type": "number",
          "default": 120,
          "minimum": 0.1,
          "description": "Current bench press 1RM, kg."
        },
        "bench_confidence": {
          "type": "string",
          "enum": [
            "conservative",
            "moderate",
            "aggressive"
          ],
          "default": "moderate",
          "description": "As squat_confidence, for the bench."
        },
        "deadlift_1rm": {
          "type": "number",
          "default": 200,
          "minimum": 0.1,
          "description": "Current deadlift 1RM, kg."
        },
        "deadlift_confidence": {
          "type": "string",
          "enum": [
            "conservative",
            "moderate",
            "aggressive"
          ],
          "default": "moderate",
          "description": "As squat_confidence, for the deadlift."
        },
        "squat_1rm": {
          "type": "number",
          "default": 180,
          "minimum": 0.1,
          "description": "Current squat 1RM, kg."
        },
        "squat_confidence": {
          "type": "string",
          "enum": [
            "conservative",
            "moderate",
            "aggressive"
          ],
          "default": "moderate",
          "description": "Attempt percentages: conservative 87/92/97%, moderate 89/94/100%, aggressive 91/96/103% of 1RM."
        }
      },
      "page": "https://aifithub.io/meet-day-attempt-selector/",
      "contract": "https://aifithub.io/contracts/meet-day-attempt-selector.json"
    },
    {
      "calculator": "hybrid-training-planner",
      "title": "Hybrid Training Planner",
      "category": "Planning",
      "summary": "Hybrid training planner: build a weekly schedule that balances running and lifting with interference warnings and recovery guidance.",
      "run": "https://aifithub.io/api/run/hybrid-training-planner",
      "example": "https://aifithub.io/api/run/hybrid-training-planner?weekly_run_km=30&easy_pct=70&tempo_pct=20&interval_pct=10&lifting_sessions=3&primary_goal=balanced",
      "inputs": {
        "weekly_run_km": {
          "type": "number",
          "default": 30,
          "minimum": 0,
          "maximum": 200,
          "description": "Weekly running distance, km (sets 2–5 run days: ≤15, ≤30, ≤50, more)."
        },
        "easy_pct": {
          "type": "number",
          "default": 70,
          "minimum": 0,
          "maximum": 100,
          "description": "Share of running at easy pace, percent (70 = 70%); the three shares are scaled to 100."
        },
        "tempo_pct": {
          "type": "number",
          "default": 20,
          "minimum": 0,
          "maximum": 100,
          "description": "Share of running at tempo, percent."
        },
        "interval_pct": {
          "type": "number",
          "default": 10,
          "minimum": 0,
          "maximum": 100,
          "description": "Share of running as intervals, percent."
        },
        "lifting_sessions": {
          "type": "number",
          "default": 3,
          "minimum": 2,
          "maximum": 6,
          "description": "Lifting sessions per week (whole number)."
        },
        "primary_goal": {
          "type": "string",
          "enum": [
            "strength",
            "endurance",
            "balanced"
          ],
          "default": "balanced",
          "description": "Which modality gets the prime slots: strength (lift-first), endurance (run-first) or balanced (alternating)."
        }
      },
      "page": "https://aifithub.io/hybrid-training-planner/",
      "contract": "https://aifithub.io/contracts/hybrid-training-planner.json"
    },
    {
      "calculator": "sleep-debt-calculator",
      "title": "Sleep Debt Calculator",
      "category": "Recovery",
      "summary": "Track 7 nights of sleep to calculate accumulated sleep debt with a recovery timeline and quality assessment.",
      "run": "https://aifithub.io/api/run/sleep-debt-calculator",
      "example": "https://aifithub.io/api/run/sleep-debt-calculator?ideal_sleep=8&day_1=7&day_2=6.5&day_3=7&day_4=6&day_5=5.5&day_6=8&day_7=8.5&actual_sleep=%5B7%2C6.5%2C7%2C6%2C5.5%2C8%2C8.5%5D",
      "inputs": {
        "ideal_sleep": {
          "type": "number",
          "default": 8,
          "minimum": 4,
          "maximum": 12,
          "description": "Hours of sleep you need a night (adults: 7 or more)."
        },
        "day_1": {
          "type": "number",
          "default": 7,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 1 (oldest)."
        },
        "day_2": {
          "type": "number",
          "default": 6.5,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 2."
        },
        "day_3": {
          "type": "number",
          "default": 7,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 3."
        },
        "day_4": {
          "type": "number",
          "default": 6,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 4."
        },
        "day_5": {
          "type": "number",
          "default": 5.5,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 5."
        },
        "day_6": {
          "type": "number",
          "default": 8,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 6."
        },
        "day_7": {
          "type": "number",
          "default": 8.5,
          "minimum": 0,
          "maximum": 24,
          "description": "Hours slept, night 7 (most recent)."
        },
        "actual_sleep": {
          "type": "array",
          "default": [
            7,
            6.5,
            7,
            6,
            5.5,
            8,
            8.5
          ],
          "description": "Alternative to day_1…day_7: exactly 7 nightly hours, oldest first, as a JSON array or comma list, e.g. [7,6.5,7,6,5.5,8,8.5]."
        }
      },
      "page": "https://aifithub.io/sleep-debt-calculator/",
      "contract": "https://aifithub.io/contracts/sleep-debt-calculator.json"
    },
    {
      "calculator": "macro-cycling-calculator",
      "title": "Macro Cycling Calculator",
      "category": "Nutrition",
      "summary": "Calculate different macros for training days and rest days with carb cycling for recomp, lean bulk, or cut goals.",
      "run": "https://aifithub.io/api/run/macro-cycling-calculator",
      "example": "https://aifithub.io/api/run/macro-cycling-calculator?bodyweight_kg=80&body_weight_kg=80&goal=recomp&training_days_per_week=4&tdee=2500&activity_level=moderate&body_fat_pct=18",
      "inputs": {
        "bodyweight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms. Alias: body_weight_kg."
        },
        "goal": {
          "type": "string",
          "enum": [
            "recomp",
            "lean_bulk",
            "cut"
          ],
          "default": "recomp",
          "description": "recomp (+100 / −300 kcal training/rest, protein 2.0 g/kg lean), lean_bulk (+200 / 0, 1.8 g/kg), cut (−100 / −500, 2.2 g/kg)."
        },
        "training_days_per_week": {
          "type": "number",
          "default": 4,
          "minimum": 1,
          "maximum": 7,
          "description": "Training days per week (whole number 1–7); the rest are rest days."
        },
        "activity_level": {
          "type": "string",
          "enum": [
            "sedentary",
            "light",
            "moderate",
            "very",
            "athlete"
          ],
          "default": "moderate",
          "description": "Activity factor for the estimated TDEE: sedentary 1.2, light 1.375, moderate 1.55, very 1.725, athlete 1.9."
        },
        "body_fat_pct": {
          "type": "number",
          "default": 18,
          "minimum": 0,
          "maximum": 69.9,
          "description": "Body fat in percent; sets lean mass for protein. Omit or 0 to assume 20%."
        },
        "tdee": {
          "type": "number",
          "default": 2500,
          "minimum": 0,
          "description": "Maintenance calories, kcal/day. Omit or 0 to estimate it (Mifflin-St Jeor for a 30-year-old 175 cm man × activity factor), which fits few people."
        },
        "body_weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Older alias of bodyweight_kg."
        }
      },
      "page": "https://aifithub.io/macro-cycling-calculator/",
      "contract": "https://aifithub.io/contracts/macro-cycling-calculator.json"
    },
    {
      "calculator": "muscle-gain-potential-calculator",
      "title": "Muscle Gain Potential Calculator",
      "category": "Body Composition",
      "summary": "Estimate your natural muscular potential with the Casey Butt model and see how close you are to your genetic limit.",
      "run": "https://aifithub.io/api/run/muscle-gain-potential-calculator",
      "example": "https://aifithub.io/api/run/muscle-gain-potential-calculator?sex=male&height_cm=178&wrist_cm=17.5&ankle_cm=22&current_weight_kg=80&current_body_fat_pct=18&training_years=0",
      "inputs": {
        "sex": {
          "type": "string",
          "enum": [
            "male",
            "female"
          ],
          "default": "male",
          "description": "male uses Butt's model; female scales it by 0.78 (assumption)."
        },
        "height_cm": {
          "type": "number",
          "default": 178,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        },
        "wrist_cm": {
          "type": "number",
          "default": 17.5,
          "minimum": 1,
          "description": "Wrist circumference at the narrowest point, cm."
        },
        "ankle_cm": {
          "type": "number",
          "default": 22,
          "minimum": 1,
          "description": "Ankle circumference at the narrowest point, cm."
        },
        "current_weight_kg": {
          "type": "number",
          "default": 80,
          "minimum": 1,
          "maximum": 650,
          "description": "Current body weight, kg."
        },
        "current_body_fat_pct": {
          "type": "number",
          "default": 18,
          "minimum": 3,
          "maximum": 60,
          "description": "Current body fat, percent (18 = 18%)."
        },
        "training_years": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 60,
          "description": "Years of consistent training so far; the timeline continues the gain curve from there. 0 = just starting."
        }
      },
      "page": "https://aifithub.io/muscle-gain-potential-calculator/",
      "contract": "https://aifithub.io/contracts/muscle-gain-potential-calculator.json"
    },
    {
      "calculator": "wendler-531-planner",
      "title": "Wendler 5/3/1 Planner",
      "category": "Strength",
      "summary": "Generate a 4-week Wendler 5/3/1 cycle from squat, bench, deadlift, and overhead-press 1RMs.",
      "run": "https://aifithub.io/api/run/wendler-531-planner",
      "example": "https://aifithub.io/api/run/wendler-531-planner?squat_1rm=140&bench_1rm=100&deadlift_1rm=180&ohp_1rm=60&training_max_pct=90",
      "inputs": {
        "squat_1rm": {
          "type": "number",
          "default": 140,
          "minimum": 0,
          "description": "Squat one-rep max, kg."
        },
        "bench_1rm": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Bench press one-rep max, kg."
        },
        "deadlift_1rm": {
          "type": "number",
          "default": 180,
          "minimum": 0,
          "description": "Deadlift one-rep max, kg."
        },
        "ohp_1rm": {
          "type": "number",
          "default": 60,
          "minimum": 0,
          "description": "Overhead press one-rep max, kg."
        },
        "training_max_pct": {
          "type": "number",
          "default": 90,
          "minimum": 80,
          "maximum": 100,
          "description": "Training max as a percent of 1RM (90 = 90%, Wendler's default)."
        }
      },
      "page": "https://aifithub.io/wendler-531-planner/",
      "contract": "https://aifithub.io/contracts/wendler-531-planner.json"
    },
    {
      "calculator": "smolov-sheiko-texas-cycles",
      "title": "Smolov / Sheiko / Texas Method Cycles",
      "category": "Strength",
      "summary": "Generate a Smolov base mesocycle, a Sheiko-style block, or a Texas Method cycle from a single 1RM input.",
      "run": "https://aifithub.io/api/run/smolov-sheiko-texas-cycles",
      "example": "https://aifithub.io/api/run/smolov-sheiko-texas-cycles?one_rm=150&cycle_choice=smolov_base",
      "inputs": {
        "one_rm": {
          "type": "number",
          "default": 150,
          "minimum": 0,
          "description": "Current one-rep max for the lift, kg (Smolov is a squat program)."
        },
        "cycle_choice": {
          "type": "string",
          "enum": [
            "smolov_base",
            "sheiko_29",
            "texas_method"
          ],
          "default": "smolov_base",
          "description": "smolov_base: published base mesocycle (week 2 +10 kg, week 3 +15 kg, week 4 test); sheiko_29: simplified Sheiko-style squat block (not the published #29); texas_method: Rippetoe's Mon volume / Wed recovery / Fri 5RM week."
        }
      },
      "page": "https://aifithub.io/smolov-sheiko-texas-cycles/",
      "contract": "https://aifithub.io/contracts/smolov-sheiko-texas-cycles.json"
    },
    {
      "calculator": "velocity-based-1rm",
      "title": "Velocity-Based 1RM Estimator",
      "category": "Strength",
      "summary": "Estimate one-rep max from concentric bar velocity using published load-velocity profiles.",
      "run": "https://aifithub.io/api/run/velocity-based-1rm",
      "example": "https://aifithub.io/api/run/velocity-based-1rm?bar_speed_m_per_s=0.5&weight_kg=100&lift_type=squat",
      "inputs": {
        "lift_type": {
          "type": "string",
          "enum": [
            "squat",
            "bench",
            "deadlift",
            "ohp"
          ],
          "default": "squat",
          "description": "Lift; squat and bench use published equations, deadlift and ohp approximate lines."
        },
        "weight_kg": {
          "type": "number",
          "default": 100,
          "minimum": 0,
          "description": "Load on the bar, kg."
        },
        "bar_speed_m_per_s": {
          "type": "number",
          "default": 0.5,
          "minimum": 0,
          "description": "Mean concentric velocity of the fastest rep, m/s (the bench equation was fitted on mean propulsive velocity, which converges with it on heavy sets)."
        }
      },
      "page": "https://aifithub.io/velocity-based-1rm/",
      "contract": "https://aifithub.io/contracts/velocity-based-1rm.json"
    },
    {
      "calculator": "concurrent-training-interference",
      "title": "Concurrent Training Interference Estimator",
      "category": "Planning",
      "summary": "Estimate strength, hypertrophy, and power gain attenuation from running while lifting (Wilson 2012).",
      "run": "https://aifithub.io/api/run/concurrent-training-interference",
      "example": "https://aifithub.io/api/run/concurrent-training-interference?lift_sessions_per_week=4&run_volume_km_per_week=30&run_intensity=moderate&recovery_days=1",
      "inputs": {
        "lift_sessions_per_week": {
          "type": "number",
          "default": 4,
          "minimum": 0,
          "maximum": 14,
          "description": "Resistance sessions per week. 0 means no strength gains to attenuate; 3+ and 4+ change the scheduling advice."
        },
        "run_volume_km_per_week": {
          "type": "number",
          "default": 30,
          "minimum": 0,
          "description": "Weekly running distance in km (50 km counts as the typical load; the volume signal caps at 75 km)."
        },
        "run_intensity": {
          "type": "string",
          "enum": [
            "easy",
            "moderate",
            "tempo",
            "intervals"
          ],
          "default": "moderate",
          "description": "Dominant running intensity: easy (zone 2, 0.5x), moderate (zone 3, 1x), tempo (zone 4, 1.4x), intervals (zone 5, 1.7x)."
        },
        "recovery_days": {
          "type": "number",
          "default": 1,
          "minimum": 0,
          "description": "Full rest days between hard runs and lifts (0 = same day); each day removes 25% of the load."
        }
      },
      "page": "https://aifithub.io/concurrent-training-interference/",
      "contract": "https://aifithub.io/contracts/concurrent-training-interference.json"
    },
    {
      "calculator": "detraining-decay",
      "title": "Detraining Decay Estimator",
      "category": "Planning",
      "summary": "Estimate 1RM loss across a layoff using the Mujika & Padilla detraining model.",
      "run": "https://aifithub.io/api/run/detraining-decay",
      "example": "https://aifithub.io/api/run/detraining-decay?prior_1rm=150&weeks_off=4&training_age_years=3",
      "inputs": {
        "prior_1rm": {
          "type": "number",
          "default": 150,
          "minimum": 0.1,
          "description": "1RM before the break, any lift, in kg (the output is in the same unit, so pounds also work)."
        },
        "weeks_off": {
          "type": "number",
          "default": 4,
          "minimum": 0,
          "maximum": 520,
          "description": "Length of the layoff in weeks (fractions allowed)."
        },
        "training_age_years": {
          "type": "number",
          "default": 3,
          "minimum": 0.01,
          "description": "Years of consistent lifting before the break: <1, 1–3, 3–7 and 7+ set the floor at 75/78/81/84% of the 1RM; the weekly rate (1.3% of the gap above the floor, after a 2-week grace period) is the same for all."
        }
      },
      "page": "https://aifithub.io/detraining-decay/",
      "contract": "https://aifithub.io/contracts/detraining-decay.json"
    },
    {
      "calculator": "junk-volume-detector",
      "title": "Junk Volume Detector",
      "category": "Planning",
      "summary": "Junk volume detector: paste a multi-week CSV training log and identify sets that don't drive strength or hypertrophy.",
      "run": "https://aifithub.io/api/run/junk-volume-detector",
      "example": "https://aifithub.io/api/run/junk-volume-detector?csv_log=week%2Cexercise%2Csets%2Creps%2Cweight%0A1%2Csquat%2C3%2C5%2C100%0A2%2Csquat%2C3%2C5%2C102.5%0A3%2Csquat%2C3%2C5%2C103",
      "inputs": {
        "csv_log": {
          "type": "string",
          "default": "week,exercise,sets,reps,weight\n1,squat,3,5,100\n2,squat,3,5,102.5\n3,squat,3,5,103",
          "description": "CSV text with a header row containing week, exercise, sets, reps, weight (any order; one row per exercise and load; weight in any consistent unit). Defaults to a 3-week sample log."
        }
      },
      "page": "https://aifithub.io/junk-volume-detector/",
      "contract": "https://aifithub.io/contracts/junk-volume-detector.json"
    },
    {
      "calculator": "marathon-pace-elevation",
      "title": "Marathon Pace + Elevation Calculator",
      "category": "Cardio",
      "summary": "Convert a target marathon time on a hilly course into the flat-equivalent pace you actually need.",
      "run": "https://aifithub.io/api/run/marathon-pace-elevation",
      "example": "https://aifithub.io/api/run/marathon-pace-elevation?target_distance_km=42.195&target_time_minutes=240&total_elevation_gain_m=200&total_elevation_loss_m=200",
      "inputs": {
        "target_distance_km": {
          "type": "number",
          "default": 42.195,
          "minimum": 0.1,
          "maximum": 1000,
          "description": "Race distance in km (marathon 42.195)."
        },
        "target_time_minutes": {
          "type": "number",
          "default": 240,
          "minimum": 0.1,
          "description": "Target finish time in minutes (3:30 = 210)."
        },
        "total_elevation_gain_m": {
          "type": "number",
          "default": 200,
          "minimum": 0,
          "description": "Total climb over the course, metres (not net)."
        },
        "total_elevation_loss_m": {
          "type": "number",
          "default": 200,
          "minimum": 0,
          "description": "Total descent over the course, metres."
        }
      },
      "page": "https://aifithub.io/marathon-pace-elevation/",
      "contract": "https://aifithub.io/contracts/marathon-pace-elevation.json"
    },
    {
      "calculator": "sweat-rate-electrolyte-marathon",
      "title": "Sweat-Rate + Electrolyte Marathon Plan",
      "category": "Cardio",
      "summary": "Compute marathon sweat rate, fluid intake, and sodium replacement plan from a single training session.",
      "run": "https://aifithub.io/api/run/sweat-rate-electrolyte-marathon",
      "example": "https://aifithub.io/api/run/sweat-rate-electrolyte-marathon?pre_weight_kg=70&post_weight_kg=68.5&fluid_consumed_ml=800&duration_minutes=240&climate=temp",
      "inputs": {
        "pre_weight_kg": {
          "type": "number",
          "default": 70,
          "minimum": 0,
          "description": "Body weight before the run, kg."
        },
        "post_weight_kg": {
          "type": "number",
          "default": 68.5,
          "minimum": 0,
          "description": "Body weight after the run, kg."
        },
        "fluid_consumed_ml": {
          "type": "number",
          "default": 800,
          "minimum": 0,
          "description": "Fluid drunk during the run, mL."
        },
        "duration_minutes": {
          "type": "number",
          "default": 240,
          "minimum": 0,
          "description": "Run duration, minutes."
        },
        "climate": {
          "type": "string",
          "enum": [
            "cool",
            "temp",
            "hot"
          ],
          "default": "temp",
          "description": "Conditions the test ran in (cool <15°C, temp 15–25°C, hot >25°C); changes the advice notes, not the numbers."
        }
      },
      "page": "https://aifithub.io/sweat-rate-electrolyte-marathon/",
      "contract": "https://aifithub.io/contracts/sweat-rate-electrolyte-marathon.json"
    },
    {
      "calculator": "race-week-taper",
      "title": "Race-Week Taper Planner",
      "category": "Planning",
      "summary": "Build a race-week taper using the Bosquet 2007 meta-analysis with distance-aware depth and weekly plan.",
      "run": "https://aifithub.io/api/run/race-week-taper",
      "example": "https://aifithub.io/api/run/race-week-taper?peak_volume=80&peak_intensity=3&taper_start_weeks_before=2&race_distance=marathon",
      "inputs": {
        "peak_volume": {
          "type": "number",
          "default": 80,
          "minimum": 0,
          "description": "Peak weekly running volume before the taper, km/week."
        },
        "peak_intensity": {
          "type": "number",
          "default": 3,
          "minimum": 1,
          "description": "Quality sessions (tempo, intervals, race pace) per week at peak, whole number."
        },
        "taper_start_weeks_before": {
          "type": "number",
          "default": 2,
          "minimum": 1,
          "maximum": 3,
          "description": "Taper length in weeks, race week included (whole number)."
        },
        "race_distance": {
          "type": "string",
          "enum": [
            "5k",
            "10k",
            "half",
            "marathon",
            "ultra"
          ],
          "default": "marathon",
          "description": "Race the taper is for; sets the average cut (41% 5K … 60% ultra)."
        }
      },
      "page": "https://aifithub.io/race-week-taper/",
      "contract": "https://aifithub.io/contracts/race-week-taper.json"
    },
    {
      "calculator": "female-athlete-formula-suite",
      "title": "Female Athlete Formula Suite",
      "category": "Body Composition",
      "summary": "Apply female-specific corrections to FFMI, Mifflin-St Jeor BMR, max heart rate, and body-fat estimation.",
      "run": "https://aifithub.io/api/run/female-athlete-formula-suite",
      "example": "https://aifithub.io/api/run/female-athlete-formula-suite?weight_kg=65&height_cm=168&age=32&body_fat_pct=24&category=regular_cycle",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 65,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms."
        },
        "height_cm": {
          "type": "number",
          "default": 168,
          "minimum": 30,
          "maximum": 275,
          "description": "Height in centimetres."
        },
        "age": {
          "type": "number",
          "default": 32,
          "minimum": 1,
          "maximum": 120,
          "description": "Age in years."
        },
        "body_fat_pct": {
          "type": "number",
          "default": 24,
          "minimum": 0,
          "maximum": 69.9,
          "description": "Measured body fat in percent (24 = 24%). Omit or 0 to estimate it from BMI and age (Deurenberg 1991)."
        },
        "category": {
          "type": "string",
          "enum": [
            "regular_cycle",
            "amenorrhea",
            "perimenopause",
            "postmenopause"
          ],
          "default": "regular_cycle",
          "description": "Life stage; adds caveats only, changes no number."
        }
      },
      "page": "https://aifithub.io/female-athlete-formula-suite/",
      "contract": "https://aifithub.io/contracts/female-athlete-formula-suite.json"
    },
    {
      "calculator": "hrv-deload-trigger",
      "title": "HRV Deload Trigger",
      "category": "Recovery",
      "summary": "Decide whether to deload from 7 days of HRV vs 30-day baseline using the Plews 2014 method.",
      "run": "https://aifithub.io/api/run/hrv-deload-trigger",
      "example": "https://aifithub.io/api/run/hrv-deload-trigger?daily=%5B55%2C57%2C52%2C48%2C46%2C47%2C45%5D&baseline_30_day=56&baseline_std_dev=0",
      "inputs": {
        "daily": {
          "type": "array",
          "default": [
            55,
            57,
            52,
            48,
            46,
            47,
            45
          ],
          "description": "Last days of HRV, oldest first, ideally 7: comma- or space-separated numbers (\"55, 57, 52\") or a JSON array. Up to 31 values."
        },
        "baseline_30_day": {
          "type": "number",
          "default": 56,
          "minimum": 0.01,
          "description": "Your 30-day average of the same measure."
        },
        "baseline_std_dev": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "description": "Day-to-day standard deviation of the 30-day baseline; omit or 0 to assume 7% of the baseline."
        }
      },
      "page": "https://aifithub.io/hrv-deload-trigger/",
      "contract": "https://aifithub.io/contracts/hrv-deload-trigger.json"
    },
    {
      "calculator": "hybrid-athlete-macro-split",
      "title": "Hybrid Athlete Macro Split",
      "category": "Nutrition",
      "summary": "Get protein, carb, and fat targets for athletes who run + lift, with training-day vs rest-day split.",
      "run": "https://aifithub.io/api/run/hybrid-athlete-macro-split",
      "example": "https://aifithub.io/api/run/hybrid-athlete-macro-split?weight_kg=75&body_fat_pct=18&run_volume_km_week=35&lift_sessions_week=3&training_days=5",
      "inputs": {
        "weight_kg": {
          "type": "number",
          "default": 75,
          "minimum": 1,
          "maximum": 650,
          "description": "Body weight in kilograms; all gram targets scale with it."
        },
        "body_fat_pct": {
          "type": "number",
          "default": 18,
          "minimum": 0.1,
          "maximum": 60,
          "description": "Body fat in percent (18 = 18%); sets lean mass and protein per kg of lean mass only."
        },
        "run_volume_km_week": {
          "type": "number",
          "default": 35,
          "minimum": 0,
          "description": "Weekly running distance, km: under 20, 20–50, 50–80, over 80 set the carb bands."
        },
        "lift_sessions_week": {
          "type": "number",
          "default": 3,
          "minimum": 0,
          "description": "Lifting sessions per week: up to 2, 3–4, 5+ set protein at 1.8, 2.0, 2.2 g/kg."
        },
        "training_days": {
          "type": "number",
          "default": 5,
          "minimum": 1,
          "maximum": 7,
          "description": "Days per week with any training (1–7); the rest are rest days."
        }
      },
      "page": "https://aifithub.io/hybrid-athlete-macro-split/",
      "contract": "https://aifithub.io/contracts/hybrid-athlete-macro-split.json"
    }
  ]
}