# Fitness API Docs Drift 2026 (how often the sources behind this site's quotes changed)

<!-- Generated by scripts/build-datasets.mjs with fitness-api-docs-drift-2026.json and fitness-api-docs-drift-2026.csv. Do not edit by hand: the next `npm run datasets` rewrites it. -->

| | |
|---|---|
| Version | 2026.1 |
| Rows | 982 |
| Columns | 11 |
| Publisher | AIFitnessAPI (aifitnessapi.com) |
| License | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) |
| Files | [fitness-api-docs-drift-2026.json](https://aifitnessapi.com/datasets/fitness-api-docs-drift-2026.json), [fitness-api-docs-drift-2026.csv](https://aifitnessapi.com/datasets/fitness-api-docs-drift-2026.csv) |
| Generated from | `src/data/researchStudies.ts DRIFT_GROUPS (generated by scripts/build-research.mjs from the git history, then by scripts/build-datasets.mjs)` |
| Sources read on | 2026-11-05 |

## License

CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/): reuse and redistribute, including commercially, with attribution to aifitnessapi.com.

## Source and method

- https://github.com/nikitastarovzz/aifitnessapi/commits/main/ops/sources/evidence

Every evidence row (a claim, a source URL and a verbatim quote) in ops/sources/evidence/*.json of the aifitnessapi repository, followed through the 20 commits that touched those files from 2026-10-17 to 2026-11-05 (main at 8fb512e). A row is written by the commit that first holds it and ends at the commit after which the file no longer holds it. endKind says how: quote or url when the same claim survives with a different quote or URL, url-and-quote for both, claim-reworded when the same URL and quote survive under a new claim, removed otherwise. cause and kind come only from the ending commit's own message, through ops/research/docs-drift-annotations.json, whose every statement is checked against that message; statement is that text. source-changed means the message says the vendor's page changed; our-change that this site changed the quote or URL and the source did not; source-unreachable that the page stopped answering; not-stated that the message does not say. Rows that share every column are one line, and rows counts them. Dates are merge dates on main, so a row written in a branch days earlier carries the merge date. The method sees only what was committed: a source that changed and changed back between reads, a page no row quotes, or a change the weekly quote check did not catch is invisible to it.

## Fields

| Field | Description | JSON types | Null in |
|---|---|---|---|
| `file` | The evidence file under ops/sources/evidence | string | 0 of 982 rows |
| `source` | The source's host, or host/owner for raw.githubusercontent.com and github.com | string | 0 of 982 rows |
| `writtenOn` | Merge date of the commit that first held the row | string | 0 of 982 rows |
| `writtenCommit` | That commit, abbreviated | string | 0 of 982 rows |
| `endedOn` | Merge date of the commit after which the file no longer held the row; null while it still does | null, string | 814 of 982 rows |
| `endedCommit` | That commit, abbreviated; null while the row is live | null, string | 814 of 982 rows |
| `endKind` | quote, url, url-and-quote, claim-reworded or removed (see methodology); null while live | null, string | 814 of 982 rows |
| `cause` | source-changed, our-change, source-unreachable or not-stated, from the ending commit's message; null while live | null, string | 814 of 982 rows |
| `kind` | fact, wording or mixed, where the ending commit's message says which; null otherwise | null, string | 850 of 982 rows |
| `statement` | The text of the ending commit's message the cause and kind come from | null, string | 815 of 982 rows |
| `rows` | How many evidence rows share every other column | integer | 0 of 982 rows |

A null means the source does not state the value or it could not be verified. It never means zero, and it is never a guess. In the CSV a null is an empty unquoted field.

## Update cadence

- `src/data/researchStudies.ts` is maintained by hand alongside the pages it feeds; this dataset is regenerated from it with `npm run datasets` in the change that edits it, so it moves when the site's pages move.
- The files are rebuilt by `npm run datasets` (scripts/build-datasets.mjs); a run with no source change writes byte-identical files. The edition stays 2026.1, and a new edition ships under a new file name rather than overwriting this one.

## Cite as

AIFitnessAPI, "Fitness API Docs Drift 2026 (how often the sources behind this site's quotes changed)," version 2026.1, aifitnessapi.com, https://aifitnessapi.com/datasets/fitness-api-docs-drift-2026.json

```bibtex
@misc{aifitnessapi-fitness-api-docs-drift-2026,
  author = {{AIFitnessAPI}},
  title = {Fitness API Docs Drift 2026 (how often the sources behind this site's quotes changed)},
  version = {2026.1},
  year = {2026},
  publisher = {aifitnessapi.com},
  url = {https://aifitnessapi.com/datasets/fitness-api-docs-drift-2026.json},
  note = {Dataset, CC BY 4.0}
}
```

Every dataset this site publishes: https://aifitnessapi.com/datasets
