Open data API
Trova's running shoe data is open: static JSON and CSV files, free to use under CC BY 4.0 with a link back. No key, no sign-up.
Last updated: 6 October 2026
The API serves 427 verified shoes: every record has been checked against the brand and retailer sources it cites. Unverified records stay out until they pass, so a value here is a value you can quote. The files are rebuilt with the site whenever the data changes. Start at the index: /data/v1/index.json.
Endpoints
Base URL https://trova.run/data/v1/. Everything is a plain static file over HTTPS, JSON in UTF-8.
| File | What it holds |
|---|---|
| index.json | Licence, attribution text, endpoint list and a description of every field. |
| shoes.json | All verified shoes: identity, status, category, support, surface, published specs with weight basis, successor, canonical URLs, source count and last verified date. |
| shoes.csv | The same records as CSV, for spreadsheets. |
shoes/{id}.json | One shoe plus its sources, every version of its line, the current successor and the top 3 current matches from other families with similarity and spec differences. Example: shoes/adidas-adios-pro-5.json. |
| drift-index.json | The Running Shoe Drift Index: how much each line changed between its last two versions, with the formula. Also as CSV. |
Licence and attribution
The data (the files above, the Drift Index and the bra size coverage report with their CSVs) is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You may copy, adapt and publish it, commercially too, as long as you credit Trova.
- Credit with a link. Credit "Trova" with a visible link to https://trova.run/ (or to the Trova page the figure comes from), link the licence, and say if you changed the data.
- Plain text:
Data: Trova (trova.run), CC BY 4.0 - HTML:
<a href="https://trova.run/">Data: Trova</a> (<a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>) - The licence covers Trova's compilation: the selection, the records and the scores. Brand and product names, trademarks, product images and the brands' own wording are not ours to license. See the terms.
Rate and caching
- No key and no enforced rate limit. The files are served from a CDN and cached at the edge for an hour.
- The data changes at most once a day. Poll at most hourly, cache on your side, and fetch
shoes.jsononce rather than every shoe file. - CORS is open (
Access-Control-Allow-Origin: *), so browsers can call it directly. - v1 only ever gains fields. A breaking change would ship as
/data/v2/, with v1 kept running.
Examples
Race shoes and their specs (shell)
curl -s https://trova.run/data/v1/shoes.json | jq '.shoes[] | select(.category == "race") | {name, specs}'One shoe and its closest matches (JavaScript)
const r = await fetch('https://trova.run/data/v1/shoes/adidas-adios-pro-5.json');
const shoe = await r.json();
console.log(shoe.name, shoe.specs.dropMm, shoe.matches.map((m) => m.name));
// Credit: Data: Trova (trova.run), CC BY 4.0, linking https://trova.run/shoes/adidas-adios-pro-5/A record from shoes.json
{
"id": "adidas-adios-pro-5",
"name": "adidas Adizero Adios Pro 5",
"brand": "adidas",
"family": "Adizero Adios Pro",
"version": "5",
"status": "current",
"category": "race",
"support": "neutral",
"surface": "road",
"released": null,
"specs": {
"stackHeelMm": 39,
"stackForefootMm": 35,
"dropMm": 4,
"weightG": 177,
"weightBasis": null
},
"successorId": null,
"successorPending": false,
"url": "https://trova.run/shoes/adidas-adios-pro-5/",
"replacementUrl": "https://trova.run/replacement/adidas-adios-pro-5/",
"api": "https://trova.run/data/v1/shoes/adidas-adios-pro-5.json",
"sourcesCount": 2,
"lastVerified": "2026-10-06"
}Fields
null always means the brand does not publish that value; we never estimate or convert. Weights are quoted at each brand's reference size (specs.weightBasis), so compare weights only on the same basis.
shoes.json records
| id | Stable slug, also the path segment of every Trova page about the shoe. |
| name | Brand, family and version, e.g. "Brooks Ghost 17". |
| brand / family / version | Model identity. A line (family) is every version sharing brand + family. |
| status | "current" (on sale as the latest version) or "discontinued". |
| category | Trova category: daily, max, tempo, race, trail or recovery. |
| support | neutral or stability. |
| surface | road or trail. |
| released | Release month YYYY-MM as published, or null. |
| specs.stackHeelMm / specs.stackForefootMm | Published stack height in millimetres, or null when not published. |
| specs.dropMm | Published heel-to-toe drop in millimetres, or null. |
| specs.weightG | Published weight in grams at specs.weightBasis (the brand's reference size), or null. |
| specs.weightBasis | Reference size the weight is quoted at, e.g. "men's UK 8.5". Compare weights only on the same basis. |
| successorId | Verified current version of the same line, or null. |
| successorPending | true when a newer current version exists but is still being verified. |
| url / replacementUrl | Canonical Trova pages for the shoe. Link one when you use its data. |
| api | The shoe's detail file. |
| sourcesCount | Number of cited sources (brand, retailer, press) behind the record. |
| lastVerified | Latest retrieval date (YYYY-MM-DD) of those sources. |
shoes/{id}.json
| … | Every field of the shoes.json record, plus: |
| sources | Cited sources: publisher, url, kind (brand | retailer | press | feed), retrieved date and the fields each one backs. |
| lineage | Every version of the line, oldest first. Verified versions carry specs and an api URL; unverified ones are named only (verified: false). |
| successor | Current version of the line (null if none): verified → id, api and deltas; pending → name and verified: false only. |
| matches | Top 3 current shoes from other families on the same surface, ranked by spec similarity (verified shoes only, same ranking as the Trova replacement page): rank, id, similarity (0–100), confidence (0–1) and deltas (match − this shoe, null when either side is unpublished). |
drift-index.json rows
| rank | Position, highest drift first. |
| from / to | Older and newer of the line's two latest versions, with their heel stack, drop, weight and weight basis. |
| deltas | Newer minus older, rounded to 0.1 (stackHeelMm, dropMm, weightG). |
| score | Drift score (see formula). |
Embeddable widgets
Two widgets, built from the same verified data, light and dark, from 320 px wide, no cookies:
- What replaced it?
/embed/successor/{id}/: the current version of a line and the closest current shoes from other families. - Versus
/embed/compare/{a}-vs-{b}/: two shoes side by side, for the pairs on our compare pages.
Every replacement and compare page has an Embed this button with the code filled in. The script version sizes itself to fit; the link it starts from stays under the widget as the credit, and is all a reader without JavaScript sees.
Script (auto height)
<a href="https://trova.run/replacement/adidas-adios-pro-5/" data-trova-embed="successor/adidas-adios-pro-5">Alternatives to the adidas Adizero Adios Pro 5 Data by Trova</a><script async src="https://trova.run/embed.js"></script>
iframe
<iframe src="https://trova.run/embed/successor/adidas-adios-pro-5/" title="Alternatives to the adidas Adizero Adios Pro 5 (Trova)" width="100%" height="600" style="border:0;max-width:640px" loading="lazy"></iframe> <p style="font:13px/1.4 system-ui,sans-serif;margin:4px 0 0">Data: <a href="https://trova.run/replacement/adidas-adios-pro-5/">Alternatives to the adidas Adizero Adios Pro 5 (Trova)</a></p>
Preview: adidas Adizero Adios Pro 5 widget, Brooks Ghost 18 vs Nike Pegasus 42 widget.
Questions or a use we should know about: [email protected].