You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
get_activities() now accepts an activitysubtype filter (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 running typeId schema (1 km / 1 mile / 5 km / 10 km / half marathon / marathon / longest run) and what value means for each. (#423)
Fixed
resume_login() after a token-store login no longer permanently loses display_name on 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 uncaught OverflowError or silently rounding to 0 (which collides with the "no threshold" sentinel), and rejects a non-list activity_type_keys instead 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.