{"openapi":"3.1.0","info":{"title":"Fit API","version":"0.1.0","description":"Exercise catalogue with instructions, workout plans, calories burned, body metrics, macros, one-rep max, heart-rate zones and running pace.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://fit.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/fit/docs"},"termsOfService":"https://connectorbay.com/fit/terms"},"servers":[{"url":"https://fit.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/fit/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/search_exercises":{"post":{"operationId":"search_exercises","summary":"Search the exercise catalogue by name with optional muscle, equipment and category filters. Use for \"dumbbell","description":"Search the exercise catalogue by name with optional muscle, equipment and category filters. Use for \"dumbbell\n    chest exercises\", \"bodyweight back exercises\", \"find hip thrust\". Follow with `exercise` for instructions.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"default":"","description":"Exercise name or words (English; German/Spanish/French names also match).","examples":["squat","romanian deadlift","push up","kettlebell swing"],"title":"Query","type":"string"},"muscle":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Primary muscle filter: chest, shoulders, biceps, triceps, lats, back, traps, abs, obliques, lower back, glutes, hamstrings, quads, calves, cardio.","title":"Muscle"},"equipment":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Equipment filter: bodyweight, dumbbell, barbell, cable, bench, pull-up bar, band, kettlebell, ez bar, mat, swiss ball.","title":"Equipment"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Category: Abs, Arms, Back, Calves, Cardio, Chest, Legs, Shoulders.","title":"Category"},"limit":{"default":10,"maximum":30,"minimum":1,"title":"Limit","type":"integer"}},"title":"search_exercisesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/exercise":{"post":{"operationId":"exercise","summary":"Full detail for one exercise: step-by-step instructions, primary and secondary muscles, equipment, images/video,","description":"Full detail for one exercise: step-by-step instructions, primary and secondary muscles, equipment, images/video,\n    aliases, names in other languages and variations. Use for \"how do I do a Romanian deadlift\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"description":"Exercise name or catalogue id.","examples":["Romanian deadlift","Bulgarian split squat","345"],"title":"Name","type":"string"}},"required":["name"],"title":"exerciseArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/exercises_by_muscle":{"post":{"operationId":"exercises_by_muscle","summary":"Exercises that primarily train a muscle, best-documented first. Use for \"what works the glutes\", \"lat exercises","description":"Exercises that primarily train a muscle, best-documented first. Use for \"what works the glutes\", \"lat exercises\n    with a band\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"muscle":{"description":"Muscle or region.","examples":["glutes","lats","shoulders","abs","calves"],"title":"Muscle","type":"string"},"equipment":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional equipment filter (e.g. bodyweight, dumbbell).","title":"Equipment"},"limit":{"default":12,"maximum":40,"minimum":1,"title":"Limit","type":"integer"}},"required":["muscle"],"title":"exercises_by_muscleArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/workout_plan":{"post":{"operationId":"workout_plan","summary":"Generate a weekly plan (full-body, upper/lower or push/pull/legs split by days) with sets, reps, rest, warm-up","description":"Generate a weekly plan (full-body, upper/lower or push/pull/legs split by days) with sets, reps, rest, warm-up\n    and progression rules, using only the equipment given. Use for \"3-day beginner plan with dumbbells only\", \"5-day\n    hypertrophy split\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"days_per_week":{"default":3,"description":"Training days per week (1–6).","maximum":6,"minimum":1,"title":"Days Per Week","type":"integer"},"goal":{"default":"general","description":"strength | hypertrophy | endurance | fat loss | general","title":"Goal","type":"string"},"level":{"default":"beginner","description":"beginner | intermediate | advanced","title":"Level","type":"string"},"equipment":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Equipment you have, e.g. ['bodyweight'], ['dumbbell','bench'], ['barbell','dumbbell','cable','pull-up bar']. Omit for a full gym.","title":"Equipment"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Seed for a repeatable plan; omit for variety.","title":"Seed"}},"title":"workout_planArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/calories_burned":{"post":{"operationId":"calories_burned","summary":"Calories burned for an activity, from MET values (best match plus alternatives). Use for \"calories burned","description":"Calories burned for an activity, from MET values (best match plus alternatives). Use for \"calories burned\n    playing cricket for an hour at 75 kg\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"activity":{"description":"Activity name.","examples":["running","badminton","yoga","cycling moderate","bhangra","swimming laps"],"title":"Activity","type":"string"},"minutes":{"description":"Duration in minutes.","exclusiveMinimum":0,"maximum":1440,"title":"Minutes","type":"number"},"weight_kg":{"description":"Body weight in kg.","exclusiveMinimum":20,"maximum":300,"title":"Weight Kg","type":"number"}},"required":["activity","minutes","weight_kg"],"title":"calories_burnedArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/activity_search":{"post":{"operationId":"activity_search","summary":"Browse the MET activity table by words or group. Use for \"which activities burn the most\", \"list dance","description":"Browse the MET activity table by words or group. Use for \"which activities burn the most\", \"list dance\n    activities\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Words to match, or omit to list groups.","examples":["dance","swim","chores"],"title":"Query"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"walking | running | cycling | swimming | gym | mind-body | class | combat | sport | outdoor | chores | everyday | leisure","title":"Group"},"limit":{"default":20,"maximum":60,"minimum":1,"title":"Limit","type":"integer"}},"title":"activity_searchArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/body_metrics":{"post":{"operationId":"body_metrics","summary":"BMI (WHO and Asian cut-offs), BMR (Mifflin-St Jeor), TDEE and calorie targets for losing/maintaining/gaining,","description":"BMI (WHO and Asian cut-offs), BMR (Mifflin-St Jeor), TDEE and calorie targets for losing/maintaining/gaining,\n    ideal-weight estimates, daily water and protein ranges; with waist/neck/hip: waist-to-height and Navy body-fat\n    percentage. Use for \"my BMI and maintenance calories\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"weight_kg":{"exclusiveMinimum":20,"maximum":300,"title":"Weight Kg","type":"number"},"height_cm":{"exclusiveMinimum":100,"maximum":250,"title":"Height Cm","type":"number"},"age":{"maximum":100,"minimum":13,"title":"Age","type":"integer"},"sex":{"description":"male | female (for the formulas)","title":"Sex","type":"string"},"activity":{"default":"moderate","description":"sedentary | light | moderate | active | very active","title":"Activity","type":"string"},"waist_cm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Waist at navel, for waist-to-height and body fat.","title":"Waist Cm"},"neck_cm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Neck below the larynx, for body fat.","title":"Neck Cm"},"hip_cm":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Hips at widest point (needed for female body fat).","title":"Hip Cm"}},"required":["weight_kg","height_cm","age","sex"],"title":"body_metricsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/macro_plan":{"post":{"operationId":"macro_plan","summary":"Protein, fat and carb targets in grams for a calorie budget and goal, with a per-meal split and diet notes.","description":"Protein, fat and carb targets in grams for a calorie budget and goal, with a per-meal split and diet notes.\n    Use for \"macros for 1800 kcal fat loss, vegetarian\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"calories":{"description":"Daily calorie target (get it from body_metrics).","maximum":6000,"minimum":800,"title":"Calories","type":"number"},"goal":{"default":"maintain","description":"lose | maintain | gain | keto | endurance","title":"Goal","type":"string"},"weight_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Body weight, to floor protein at 1.6–2 g/kg.","title":"Weight Kg"},"diet":{"default":"omnivore","description":"omnivore | vegetarian | vegan","title":"Diet","type":"string"}},"required":["calories"],"title":"macro_planArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/one_rep_max":{"post":{"operationId":"one_rep_max","summary":"Estimated one-rep max from a set, with a percentage/rep table for programming. Use for \"1RM if I squat 100 kg","description":"Estimated one-rep max from a set, with a percentage/rep table for programming. Use for \"1RM if I squat 100 kg\n    for 5\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"weight":{"description":"Weight lifted (any unit; output uses the same).","exclusiveMinimum":0,"maximum":1000,"title":"Weight","type":"number"},"reps":{"description":"Reps completed with good form.","maximum":30,"minimum":1,"title":"Reps","type":"integer"}},"required":["weight","reps"],"title":"one_rep_maxArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/heart_rate_zones":{"post":{"operationId":"heart_rate_zones","summary":"Five training zones in bpm (Karvonen when resting HR is given, else % of max HR), with what each feels like.","description":"Five training zones in bpm (Karvonen when resting HR is given, else % of max HR), with what each feels like.\n    Use for \"heart-rate zones at 40 with resting 58\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"age":{"maximum":100,"minimum":10,"title":"Age","type":"integer"},"resting_hr":{"anyOf":[{"maximum":120,"minimum":30,"type":"integer"},{"type":"null"}],"default":null,"description":"Resting heart rate (bpm) for Karvonen zones.","title":"Resting Hr"},"max_hr":{"anyOf":[{"maximum":230,"minimum":120,"type":"integer"},{"type":"null"}],"default":null,"description":"Measured max HR if known.","title":"Max Hr"}},"required":["age"],"title":"heart_rate_zonesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/pace_calculator":{"post":{"operationId":"pace_calculator","summary":"Pace per km and mile, speed, km splits, Riegel predictions for other distances and suggested training paces.","description":"Pace per km and mile, speed, km splits, Riegel predictions for other distances and suggested training paces.\n    Give either a finish time or a pace. Use for \"what pace for a sub-2 half\", \"5k at 5:30/km\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"distance":{"description":"Distance: '5k', '10k', 'half marathon', 'marathon', '1 mile', '7.5 km', '3 mi'.","examples":["10k","half marathon","5 km"],"title":"Distance","type":"string"},"time":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Finish time h:mm:ss or mm:ss.","examples":["1:55:00","24:30"],"title":"Time"},"pace_min_km":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Pace per km mm:ss, instead of time.","examples":["5:30"],"title":"Pace Min Km"}},"required":["distance"],"title":"pace_calculatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}