What's Changed
Added
get_activities()now accepts anactivitysubtypefilter (e.g.activitytype="fitness_equipment",activitysubtype="strength_training") for narrower activity searches. (#419)- New
create_gear()method to register a new piece of gear (e.g. a pair of shoes) directly via the API — previously only linking/unlinking existing gear was possible. (#418, #424) get_personal_record()'s docstring now documents the runningtypeIdschema (1 km / 1 mile / 5 km / 10 km / half marathon / marathon / longest run) and whatvaluemeans for each. (#423)
Fixed
resume_login()after a token-store login no longer permanently losesdisplay_nameon an incomplete/transient profile fetch — the fetch is retried, and the documented fallback behavior for genuinely new/empty accounts (no display name configured) is preserved. Previously this silently broke every endpoint that needs a display name (get_rhr_day,get_sleep_data,get_personal_record, etc.) for the rest of the client's lifetime. (#421, #422)get_activities()response handling normalized so a dict-shaped response ({"activityList": [...]}) is handled the same as a plain list. (#419 follow-up)create_gear()rejects non-finite (inf/nan) and sub-unit usage-limit values instead of raising an uncaughtOverflowErroror silently rounding to 0 (which collides with the "no threshold" sentinel), and rejects a non-listactivity_type_keysinstead of silently iterating it character-by-character.
Demo (demo.py)
- New interactive menu option to create gear, prompting for type/brand/model/usage tracking/activity associations.
- New interactive activity type/subtype filter picker — pulls the live type list from
api.get_activity_types()instead of requiring a config edit. - "Get personal records" now decodes and formats values instead of dumping raw numbers: running records show as times (
m:ss/h:mm:ss) or distance (km), and step-count/goal-streak records (most steps in a day/week/month, longest/current goal streak) are now decoded too — all confirmed against a real account. Anything outside the confirmed set is still shown in full (never hidden), just unlabeled. - Lets you look up a personal record's source activity (needed for longest-run duration, which isn't in the record entry itself).
Docs
- README's API coverage stats corrected — was significantly stale (missing an entire "Activity Editing" category, wrong Training Plans count); now 145+ methods across 14 categories, recomputed directly from
demo.py.