Fitness API deprecation scanner: find Fitbit Web API, Google Fit and other dead calls
Paste code, a package.json, build.gradle, Podfile or requirements.txt, or a list of URLs, and this scanner finds references to fitness APIs and SDKs their vendors have shut down, scheduled to shut down or deprecated: all 121 Fitbit Web API endpoints (turn-off November 2, 2026, per Google), the Google Fit REST and Android APIs (end of support 2026), and 10 more from this site's Fitness API Graveyard, 129 patterns in all. Each hit shows the line, what happened in the vendor's own words at the precision the vendor gave, and the replacement the vendor or Google's migration tables name, with the migration guide. The scan runs in your browser; nothing is uploaded. The same rules run in CI as a GitHub Action.
Samples (synthetic): · · · ·
Run the same scan in CI
The rules above also ship as a GitHub Action in this site’s repository. Add this workflow to .github/workflows/:
name: Fitness API deprecation check
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: nikitastarovzz/aifitnessapi/actions/fitness-api-deprecation-check@main
with:
path: .
fail-on: error # or: warning, never
GitHub Action: uses: nikitastarovzz/aifitnessapi/actions/fitness-api-deprecation-check@main (inputs path, exclude, fail-on = error | warning | never; outputs hits, errors, warnings). It writes an annotation on each line and a job summary table, with no dependencies and nothing sent anywhere. "error" means the vendor says the API is gone, or it is dying and the date the vendor gave has passed; "warning" means deprecated, or dying with the date still ahead. A line containing fitness-api-deprecation-ignore is skipped.
The Action and this page run one rule file and one engine. Both are written by a generator from this site’s data, and the build fails when the Action’s copy differs, so the two cannot disagree. A workflow in the repository runs the Action on its own test fixtures on every change.
What it looks for
129 patterns over 14 entries of the Fitness API Graveyard. Status and date are the graveyard’s, which keeps each vendor’s precision: a year stays a year. Each Fitbit hit links its row on the Fitbit to Google Health API map.
| API or SDK | Status | What is matched | Replacement the vendor names |
|---|---|---|---|
| Fitbit Web APIGoogle (Fitbit) | Dying. Turn-off: November 2, 2026 | Every endpoint path in Fitbit’s reference (102 paths for 121 endpoints), its OAuth endpoints on a fitbit.com host, the api.fitbit.com host, and fitbit (PyPI), a client for the Fitbit Web API. | Google Health API |
| Terra legacy widget session endpointTerra | Dying. Deprecation planned: November 3, 2026 |
| POST access.tryterra.co/api/widget/session |
| Google Fit APIs (Android and REST)Google | Dying. End of support: 2026 |
| Google Health API (cloud); Health Connect (Android) |
| Google Fit Goals APIGoogle | Dying. End of support: 2026 |
| None |
| Google Fit Sensors API and BLE APIGoogle | Dying. End of support: 2026 |
| Android Sensors framework or Fused Location Provider (Sensors API); Android Bluetooth APIs (BLE API) |
| Strava Club Activities, Club Members and Club Admins endpointsStrava | Dead. Removed: September 1, 2026 |
| None |
| Samsung Health SDK for AndroidSamsung | Deprecated. Deprecated: July 31, 2025 |
| Samsung Health Data SDK |
| Oura API V1Oura | Dead. Removed: January 22, 2024 |
| Oura API V2 |
| WHOOP API v1WHOOP | Deprecated. No longer supported |
| WHOOP API v2 |
| MediaPipe Pose (Legacy Solution)Google | Deprecated. Upgraded to a new solution: May 10, 2023 |
| MediaPipe Pose Landmarker (Tasks API) |
| PoseNet for TensorFlow.js (@tensorflow-models/posenet)Google (TensorFlow.js) | Deprecated. Deprecated |
| @tensorflow-models/pose-detection |
| Strava Running Races endpointsStrava | Dead. Removed: November 1, 2021 |
| None |
| Moves app and developer APIMoves | Dead. Shut down: July 31, 2018 |
| None |
| Google Health (personal health record service)Google | Dead. Retired: January 1, 2012 |
| None |
What it does not look for
- Oura personal access tokens: A personal access token is sent like any other bearer token, so nothing in code tells it apart from an OAuth token.
- Google Fit Sensors API and BLE API: Google's BLE API page names no client class or method this site could quote, so only the Sensors API half is scanned.
How a hit is decided
- Only strings a vendor prints. Every pattern is a written form of something on a vendor page (a path in Fitbit's request tables, a host or a Gradle coordinate in Google's Fit docs, a package name on its registry page), and “Why this pattern” under each hit quotes that page. An API the site has not sourced is not guessed at.
- Most specific wins. A Fitbit URL is matched against every endpoint path, placeholders and all ({date}, ${id}, %s), and the longest fixed text wins. The bare host, or a /1/user/ path in a file that names Fitbit, reports only when no endpoint matched the line, which is how a URL built by string concatenation is still found.
- Packages by registry. npm names match in code and package.json; PyPI names only on a line of a Python manifest (requirements.txt, pyproject.toml, Pipfile), since a Python import name need not be the package name.
- Severity from the vendor's date. Red (an error in CI) when the vendor says it is gone, or it is dying and the date given has passed; a year counts as passed only after December 31. Amber (a warning) for deprecated, or dying with the date ahead.
- The replacement is the vendor's. For Fitbit endpoints, the Google Health API data type and method from Google's migration tables, the same rows as the Fitbit to Google Health API map; where the tables have no row, the hit says so.
Sources and what this cannot tell you
Built 2026-11-06 from: the graveyard (entries read up to 2026-10-31), Fitbit’s Web API reference (read 2026-11-05 through source snapshots), Google’s migration tables (read 2026-10-31), the library registry data (read 2026-10-03) and the pages behind the other patterns (read 2026-11-06; hosts blocked from where this site is built were read on a GitHub runner, and old API docs through Internet Archive captures). Each quoted passage is in an evidence file that a weekly workflow re-checks against the live page.
A text scan cannot see a URL assembled across files, a call made inside a dependency, or an SDK pulled in by another SDK. A clean result means none of these patterns appear, not that nothing in the app depends on a retired API. Pasted text and opened files stay in this tab.
A free tool from AIFitnessAPI. More at free tools for health-app builders.
Next step
Turning this into a choice of API: