Python libraries for fitness APIs
7 packages (7 PyPI) · 2 comparisons · registries read 2026-10-03 · README notes checked 2026-10-03
Every Python package on this list
Read from the registries and repositories by a script, not typed by hand. Release dates are shown as dates, with the gap to our read, rather than as a verdict on whether a project is alive; what each README says about its own status is under How to choose and on each package page.
| Package | Connects to | Repository | Latest release | Licence | Registry status | Last commit |
|---|---|---|---|---|---|---|
| garminconnectPyPI · Python | Garmin Connect | cyberjunky/python-garminconnect | 0.3.17, 2026-09-294 days before our read | MIT | — | 2026-09-29default branch, read 2026-10-03 |
| garthPyPI · Python | Garmin Connect | matin/garth | 0.8.0, 2026-03-28189 days before our read | MIT | Inactive (PyPI classifier) | 2026-03-28default branch, read 2026-10-03 |
| stravalibPyPI · Python | Strava API | stravalib/stravalib | 2.6.0, 2026-08-2737 days before our read | Apache-2.0 | — | 2026-09-22default branch, read 2026-10-03 |
| oura-ringPyPI · Python | Oura API | hedgertronic/oura-ring | 1.0.1, 2026-06-22103 days before our read | MIT | — | 2026-07-07default branch, read 2026-10-03 |
| ouraPyPI · Python | Oura API | turing-complet/python-ouraring | 1.3.0, 2024-04-23893 days before our read | MIT License | — | 2024-04-23default branch, read 2026-10-03 |
| fitbitPyPI · Python | Fitbit Web API | orcasgit/python-fitbit | 0.3.1, 2019-05-242,689 days before our read | Apache 2.0 | — | 2019-08-12default branch, read 2026-10-03 |
| withings-apiPyPI · Python | Withings API | vangorra/python_withings_api | 2.4.0, 2022-02-081,698 days before our read | MIT | — | 2022-03-05default branch, read 2026-10-03 |
Versions, dates and licences read from PyPI on 2026-10-03; last-commit dates read by git on 2026-10-03; archive flags from the GitHub API, read 2026-10-03. This data records no download counts, so the table has no downloads column. Repository is the GitHub owner and name as GitHub reports it, which is how the data names a maintainer.
How to choose: our reading
Judgement, labelled as such, drawn only from the README notes and registry facts on each package’s page and from the comparisons. No package is ranked first.
Garmin Connect
- Starting fresh: garth's own README says new logins do not work, which settles it.
- Running garth today on a saved session: it may keep working until the OAuth1 token expires; schedule the move before then rather than after.
- Moving to garminconnect: its README says garth-era token files cannot be converted, so budget for one interactive login (with MFA if the account uses it).
- Building for other people's Garmin data rather than your own: both are unofficial clients; Garmin's official developer program is the route for that.
Strava
- stravalib wraps the Strava V3 API rather than replacing it, so you still register a Strava app first; its README's tutorials start there, then cover refreshing the token and reading activities and athlete data.
- Its README lists Python 3.11 or later, and its PyPI metadata declares requires_python >=3.11.
Oura
- New integration: it has to use OAuth2 (no new personal access tokens), and oura-ring is the one whose README documents that flow end to end.
- Existing script on oura with a previously issued token: it may keep working, but neither the token nor the client's v2 OAuth path is something to build new work on.
- Either way, both wrap the same Oura API, so Oura's app registration and scopes apply identically.
Fitbit
- python-fitbit, published on PyPI as fitbit, was written for the legacy Fitbit Web API. Its latest release dates from May 2019, and its README still lists Python 2.7+.
- Google's Fit migration guide lists the Google Health API as the recommended path for Fitbit Web API integrations, and nothing in python-fitbit's README mentions it.
Withings
- withings-api authenticates with OAuth 2.0 using a client ID and consumer secret from a Withings developer application, and its README shows a demo mode for testing against Withings' demo data.
- Its latest release, 2.4.0, dates from February 2022, and its PyPI metadata declares Python >=3.6,<4.0: an author's declaration rather than a test result, so test it on the interpreter you deploy.
Platform rules these packages inherit
A wrapper inherits every rule of the API it calls. Each rule below is stated, with its sources, on the page it links.
Neither on-device store has a web API for a Python client to call: HealthKit's setup has no tokens or server endpoint, and Health Connect is not an OAuth cloud API. Apps read both on the device.
HealthKit integration guide → · Health Connect integration guide →
garminconnect and garth are unofficial clients that sign in as the user; Garmin's official developer program is the route for an app that serves other people's Garmin data.
stravalib wraps the Strava V3 API rather than replacing it, so Strava's OAuth, scopes and webhooks still apply.
New Oura integrations use OAuth2: the oura-ring README says Oura deprecated personal access tokens in December 2025, so new ones can no longer be created.
Google gives October 30, 2026 as the Fitbit Web API's turn-off date, after which it no longer functions or syncs data (Google's Google Health API documentation, read 2026-10-17). python-fitbit was written for that API.
Fitbit API shutdown: what is confirmed → · Google Health API reference →
Side-by-side comparisons
- garminconnect vs garth →garminconnect vs garth for Garmin Connect in Python: garth is deprecated and garminconnect dropped it in 0.3.0. Registry dates, status and migration.
- oura-ring vs oura (python-ouraring) →oura-ring vs oura (python-ouraring) for the Oura API in Python: OAuth2 support, the personal-access-token change, maintenance notes, release dates.
The APIs underneath
The pages these packages’ own pages point to for the API each one wraps.
- Garmin API integration guide →
- Garmin API approval →
- Garmin API for personal use →
- Strava API integration guide →
- Strava API 401 Unauthorized →
- Strava webhook not firing →
- Oura API integration guide →
- Oura personal access token deprecated →
- Fitbit API shutdown: what is confirmed →
- Migrate the Fitbit Web API to Google Health →
- Fitbit API integration guide →
- Fitbit error code 401 →
- OAuth redirect URI mismatch →
- Refresh token not working →
Questions
- Which fitness APIs have a Python client on this site's list?
- Five: Garmin Connect (garminconnect and garth), the Strava API (stravalib), the Oura API (oura-ring and oura), the Fitbit Web API (fitbit) and the Withings API (withings-api). Each package wraps one vendor's web API, according to its registry description, and none reads Apple HealthKit or Android Health Connect.
- Can I read Apple Health or Health Connect data from Python?
- Not through a web API. HealthKit data lives only on Apple devices and Apple's setup has no tokens or server endpoint, and Health Connect is an on-device Android store, not an OAuth cloud API, so neither offers an endpoint for a Python client to call. The Python packages this site tracks call vendor web APIs instead: Garmin Connect, the Strava API, the Oura API, the Fitbit Web API and the Withings API.
- Which Python fitness API clients are deprecated or looking for a maintainer?
- garth: its README says it is deprecated and no longer maintained, and its PyPI classifier reads "Development Status :: 7 - Inactive". oura, the python-ouraring project: its README asks for someone to take over maintenance. Two more had published nothing newer at our registry read: fitbit (python-fitbit), last released in May 2019, and withings-api, in February 2022.
- How do the Python fitness API clients sign in?
- Each in its vendor's way, according to its README. garminconnect logs in with the user's own Garmin credentials through Garmin's mobile sign-in flow, with an MFA callback, and stores the tokens locally. stravalib authenticates against a Strava app you register and keeps the token current. oura-ring wraps Oura's OAuth2 authorization-code flow, while the older oura client's examples start from a personal access token. withings-api uses OAuth 2.0 with a client ID and consumer secret from a Withings developer application, and python-fitbit is built on requests-oauthlib. garth's README says new logins no longer work.
Registry facts read by scripts/fetch-libraries.mjs on 2026-10-03; README notes checked on 2026-10-03. README quotes and notes are each project's own statements; the selection, grouping and reading are AIFitnessAPI's, which publishes none of these packages.