update_athlete_profile
Edit the athlete's profile — FTP (watts), running threshold pace, max/threshold HR, power/pace/HR zone boundaries, AND the about-you fields (birthdate, sex, heightCm, weightKg, weeklyHours, availableDays 0=Mon..6=Sun, experience). Every field is OPTIONAL: pass only what changes; everything else is preserved (safe partial update). Confirm new numbers with the athlete before writing (a changed FTP/weight moves every target). To set custom zones pass a sport's zoneBounds (5 strictly-ascending upper bounds) — that flips it to Manual; pass autoZones:true to revert. Same for hrZoneBounds/autoHrZones. Setting birthdate refreshes the age-based HRmax estimate unless maxHr was set manually — writing a sport's maxHr marks it manual, and autoMaxHr:true hands it back to the estimate. Server-validated; rejects an invalid edit instead of writing a broken profile. Only touches the profile, never the calendar or library. Read with get_athlete_profile first.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ftp | No | cycling FTP, watts | |
| run | No | running thresholds + zones | |
| sex | No | ||
| sft | No | the athlete's CYCLING submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. The standard protocol (Science to Sport, what intervals.icu detects) is about 110% of FTP for 3 min (sec 180) — get_fatigue_tests proposes it — agree it with them, and do not change it mid-season — a new value starts a new baseline. | |
| bike | No | cycling thresholds + zones | |
| sftRun | No | the athlete's RUNNING fatigue test: about 105% of threshold speed for 3 min (sec 180), frozen for the season, on a treadmill or a flat loop, then a minute of walking — get_fatigue_tests sport:"running" proposes it. null = stop tracking. | |
| control | No | what they TRAIN BY per sport (Profile "You train by"): the signal you judge and speak in — not the watch's default (running hr also sets runByHr); null = back to what their files show. Only when they say so. | |
| cssPace | No | SWIM threshold — critical swim speed, seconds per 100 m. Confirm it with the athlete before writing: without it swims carry no load, and with a wrong one every swim in their history is mis-scored. From a 400 m + 200 m time trial: (400-200)/(t400-t200) m/s. | |
| runByHr | No | true = runs default to HR targets on the watch (= control.running "hr") | |
| thrPace | No | running threshold pace, seconds per km | |
| dayCheck | No | a subscriber's "Day check" (Profile → Assistant): the assistant's own short look at today or tomorrow when the gym log or check-in gives a reason — false turns it off. Only when they ask. | |
| heightCm | No | ||
| weightKg | No | kg — enables W/kg and body-mass fuelling | |
| autoMaxHr | No | true = go back to the age-based HRmax estimate. Writing a sport's maxHr flips this to manual on its own. | |
| birthdate | No | YYYY-MM-DD (age is derived); setting it refreshes the age-based HRmax estimate unless maxHr was set manually (maxHrAuto:false — read it back in get_athlete_profile) | |
| experience | No | training age → ramp aggressiveness | |
| powerMeter | No | false = no power meter: ride targets show as HR + RPE; prescribe by HR and feel | |
| weeklyHours | No | typical training hours/week | |
| availableDays | No | weekdays free to train, 0=Mon..6=Sun | |
| suggestReviews | No | post-session reviews (Profile → Assistant). For a Blocks Unlimited subscriber this is "Automatic reviews": Blocks reviews a finished training session on its own (20 min+, up to 2 a day, none at night) — false turns that off. For everyone else it is the offer of a review after a key session. Only when they ask. |