Reference & coverage
7/v1/countries/v1/courses/v1/meta/coverage/v1/search
+3 more
578,383 races across 36 jurisdictions since January 2017. Each runner's place, price and every move of its market, with sectional times wherever the course publishes them. One clean JSON call, refreshed every two minutes.
No card. Google sign-in, first request in ninety seconds.
Free key, no card, about ninety seconds.
curl https://api.apihorseracing.com/v1/results/2026-09-07 \
-H "X-API-Key: $AHR_KEY"
Every endpoint, every course, every country. The only thing held back is when: results reach a free key the day after the race, and today's racing is on Live. Nothing else about it is a lesser product.
Upgrade later and the same key reaches further back. Nothing to re-integrate.
{ "race_id": "rc_7K2M9P", "course": "Musselburgh", "country": "Scot", "region": "GB", "date": "2026-09-07", "off_time": "14:35:12", "run_type": "Hurdle", "distance": "1m 4f", "going": "Good to soft", "class": "4", "winning_time": "5m 16.70s", "book_percentage": 112.4, "runners": [ { "cloth": 1, "horse": "Ballyarthur", "position": 1, "sp": "15/8", "sp_path": ["7/4", "6/4", "13/8", "7/4", "15/8"], "favourite": false, "jockey": "S Twiston-Davies", "trainer": "N & W Twiston-Davies", "official_rating": 119, "weight": "11-5" }, { "cloth": 6, "horse": "Daring Knight", "position": null, "casualty": "PulledUp", "sp": "50/1" } ], "dividends": { "tote_win": "3.90", "exacta": "18.40" } }
Forty four fields on one Class 4 hurdle at Musselburgh, from the ground it was run on to what the tote paid out. The rows in brass are the ones a results feed leaves behind.
set in advance
at declaration
into the off
at the line
after the weigh-in
Every one of those, on 578,321 races going back to January 2017. Pedigree, price path and dividends included, not sold as a second product.
See every field in the docswin_pct · a_e · pl_1pt · roi_pct
A strike rate counts wins and ignores what they paid. A yard winning 30% of its odds-on favourites is losing money, and nothing but A/E and level stakes will tell you so.
win_pctHow often they win. The number everyone quotes, and the one that tells you least. A yard winning 30% at odds-on is a losing angle.
a_eActual wins against expected, where expected is the sum of implied probabilities from starting price. Above 1.00 beats the market.
pl_1ptWhat one point on every runner would have returned, settled at starting price. The plainest answer to whether an angle has paid.
first … fourthPositions come back separately rather than lumped into a placed count, so you apply your own terms, not ours.
Coverage is never uniform, so we split every country into two periods. The modern period is the stretch where its fields are at their fullest. The history is what came before, shown just as plainly. Pick a country to see its dates, its depth and every field we hold.
2022 to todaymodern period for most countries: full finishing order in the USA, breeding on every runner, beaten distances at their best
2012 to 2021history: every race and starting price, with thinner runner detail, shown as plainly
578,321 racesacross twenty-two jurisdictions, served on every paid plan
Read this before you subscribe, not after. Every figure here is counted from the data the API serves, and refreshed every hour.
Full coverage detail520 weeks, none of them missing. Not a rolling window that quietly forgets last season, and not a sample. The whole thing, on every plan that reaches it. Earlier still: South Korea, back to January 2015 (5,526 races); Japan, back to November 2012 (5,380 races).
Depth is the product. Anyone can serve you today's card. Nine and a half years of results, prices and price paths is what lets you test whether an idea has ever worked.
Reach the whole archive See the pricingOne registry file is the single contract. It drives the router, the documentation, the OpenAPI export and the Postman collection, so a path that exists here exists everywhere, and one that does not cannot be documented by accident.
/v1/countries/v1/courses/v1/meta/coverage/v1/search+3 more
/v1/reports/v1/reports/{race_id}/v1/racecards/today/v1/racecards/upcoming/v1/meetings/{date}/v1/results/latest+5 more
/v1/races/search/v1/races/{race_id}/result/v1/races/{race_id}/market/v1/races/{race_id}/dividends+3 more
/v1/horses/{horse_id}/form/v1/horses/{horse_id}/pedigree/v1/horses/{horse_id}/layoff/v1/horses/compare+4 more
/v1/trainers/search/v1/trainers/{trainer_id}/form/v1/trainers/{trainer_id}/jockeys/v1/trainers/{trainer_id}/courses+3 more
/v1/jockeys/{jockey_id}/form/v1/jockeys/{jockey_id}/trainers/v1/owners/{owner_id}/jockeys/v1/owners/{owner_id}/courses+6 more
/v1/webhooks/subscribe/v1/webhooks/deliveries/v1/account/usage/v1/courses/{course_id}/draw-bias/v1/courses/{course_id}/standard-times/v1/courses/{course_id}/favourites/v1/courses/{course_id}/casualties+2 more
/v1/market/sp-performance/v1/market/movers/v1/market/overround/v1/analysis/angles+2 more
Every one of them takes the same shape. Cursor or page, the same error codes, the same meta block, timestamps in UTC, and v1 only ever gains fields. Nothing is deprecated out from under something you have already shipped.
Browse the docs Download the OpenAPI specEvery plan reads the same database, the same 36 jurisdictions, the same fields. Two things separate them: how much history you can reach, and whether the statistics arrive computed. There is no per-endpoint plan list to memorise.
Yesterday's racing, settled. No card.
Today's cards and results, for a site or an app.
The whole history, at research pace, for backtesting.
History and live together, for a product in the wild.
Saves $29 a month
Strike rates, A/E and level stakes, already computed.
36 jurisdictions on every paid plan. Nothing here is an add-on, and upgrading widens the window on the key you already hold, so there is nothing to re-integrate.
Full pricing and limits Start on the free keySign in with Google, create a key, and run these four in order. By the fourth you will know whether this archive answers the question you actually have, which is a better test than any page we could write.
Every meeting and race on the day across 36 jurisdictions, with going, distance, class and the declared field.
Open in docsThe full card: weights, draw, ratings, form, headgear, connections, and the market as it stands.
Open in docsFinishing order, starting prices, the path they moved along, casualty reasons and what the tote paid.
Open in docsNine years of runners split by course, with A/E and level stakes, so you find out whether an idea has ever worked.
Open in docs