activy-checker
Audit Activy's activity sync: detect activities that never arrived and activities recorded with incorrect distances — and get a clean summary of your training. It currently compares Activy with Garmin Connect; other sources can be requested.
Activy imports workouts from Garmin, but the import is not always complete: a
ride can silently never appear, or show up with the wrong distance. If Activy
powers a company or charity challenge, those gaps cost you points.
activy-checker logs into your two accounts, pulls your activities for a
date range and tells you exactly what is different.
Matched: 5 | Missing in Activy: 1 | Missing in Garmin: 0 | Distance mismatches: 1
-- Missing in Activy (present in Garmin, not imported) [1] --
2026-05-10 road_biking 98.40 km 3:12:00
Why I built this
Activy's import from Garmin is not 100% reliable. I found out by pure chance: one day I noticed that an activity recorded on my Garmin had never appeared in Activy. Nothing warned me — not the app, not Activy.
When I contacted Activy support, I was not told about any errors on their side, and they were not willing to look at the history of my earlier activities to check whether anything else was missing. I found that strange: if one activity can silently go missing, others can too, and I had no way to check.
That is why I wrote activy-checker — so that anyone can verify their own
Activy history against Garmin instead of relying on luck.
Features
- Missing in Activy — activities recorded on Garmin that never reached Activy.
- Missing in Garmin — activities that exist only in Activy (e.g. manual entries).
- Distance mismatches — the same activity stored with a different distance.
- Summaries — count, distance and time per activity kind, for each source.
- JSON export of everything above, for your own scripts or a support ticket.
- Passwords are prompted with
getpassand never stored; the Garmin session can optionally be cached so MFA is needed only once.
Disclaimer
This is an unofficial tool, not affiliated with or endorsed by Activy or
Garmin. Activy has no public API, so activy-checker talks to the same mobile
endpoints the Activy app uses, signing in with your own credentials. Use it only
with your own account and your own data, at your own risk. The Activy API
can change without notice and break the tool.
Quick start
Requires Python 3.12+. The easiest way is pipx, which installs the command in its own environment:
pipx install activy-checker
activy-checker --garmin-tokenstore ~/.garminconnect
or with pip: pip install activy-checker. To work on the code, see
Contributing.
You will be asked for your Activy email and password, then your Garmin email and password and — if your Garmin account uses two-step verification — the code Garmin emails you.
Common commands
activy-checker # from 2026-09-01 (default)
activy-checker --since 2026-09-01 --until 2026-09-30
activy-checker --activy-only # just summarize Activy
activy-checker --garmin-tokenstore ~/.garminconnect # cache Garmin session
activy-checker --since 2026-09-01 --json result.json # machine-readable output
All options are described in docs/usage.md.
Example output
== Activy ==
Kind Count Distance Time
----------------------------------------
Bike 2 103.5 km 3:31:00
Run 2 9.3 km 1:27:00
Exercise 1 0.0 km 0:25:00
----------------------------------------
TOTAL 5 112.8 km 5:23:00
== Garmin ==
Kind Count Distance Time
----------------------------------------
Bike 3 201.9 km 6:43:01
Run 1 5.2 km 0:32:01
Walk 1 9.9 km 0:55:01
Exercise 1 0.0 km 0:25:00
----------------------------------------
TOTAL 6 217.0 km 8:35:03
== Comparison: Activy vs Garmin ==
Matched: 5 | Missing in Activy: 1 | Missing in Garmin: 0 | Distance mismatches: 1
-- Missing in Activy (present in Garmin, not imported) [1] --
2026-05-10 road_biking 98.40 km 3:12:00
-- Missing in Garmin (present in Activy only) [0] --
(none)
-- Distance mismatches (same activity, different distance) [1] --
2026-05-05 Activy 4.10 km vs Garmin 9.87 km (Δ -5.77 km)
(Sample data.) Note that the two summaries use each service's own categories: Activy files Garmin walks and hikes under Run, so kinds are not expected to line up one-to-one — the comparison matches individual activities, not kinds.
Documentation
- Usage — every option, exit codes, JSON format, using it as a library
- How it works — the Activy API, fetching, matching rules, type mapping
- Troubleshooting — login problems, Garmin rate limits, reading the results
- Contributing — development setup, tests and releases
- Changelog
Other integrations
activy-checker currently compares Activy with Garmin Connect only. If
you use Activy with Strava, Polar, Suunto or another service and
would like it supported, please
open a feature request
and tell us which service you use.
Found a bug? Report it here.
License
MIT — see LICENSE.
Metadata
Release files for activy-checker 0.2.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| activy_checker-0.2.6.tar.gz | 35.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| activy_checker-0.2.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.0 kB
Release files / activy_checker-0.2.6.tar.gz
| Download URL | activy_checker-0.2.6.tar.gz |
|---|---|
| Size | 35.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e02a8f237609b12135499b4a3027c2357bf32079d43e722529c65b342c611fcb
|
|
BLAKE2b-256 checksum How to use checksums |
380bbb499a7e24a24c2c15a63ed504363dae6ce13cd1b7f4e782a0a3c10e2675
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logRelease files / activy_checker-0.2.6-py3-none-any.whl
| Download URL | activy_checker-0.2.6-py3-none-any.whl |
|---|---|
| Size | 17.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3ab53f7a25933da45573ecb898d80aed71f7e19eb670323c886fd3eb8d7df94e
|
|
BLAKE2b-256 checksum How to use checksums |
eeee00852628327f8d99c28e14d443924e3b8327d59e795badab18c2f2662f48
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency log