APIHorseRacing OCT26Calendar148 so far

Horse Racing API

Every race, timed and priced with precision.

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.

578,383races held
36jurisdictions
2 minsync cycle
REPLAY
GET
RACE CLOCK0:00.00
POSNORUNNERGAP
EVENTS
200 OKdata_as_of 18:40Zsectionals: Hong Kong

Your first request

Free key, no card, about ninety seconds.

curl https://api.apihorseracing.com/v1/results/2026-09-07 \ -H "X-API-Key: $AHR_KEY"
Get a free key

The free key is real racing, just not today's.

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.

Every endpoint on the tier36 jurisdictions, none of them sold as add-ons
60 endpoints
Real results, held backNot invented sandbox races with made-up horses
yesterday only
Enough to build againstPer minute, and per day
60 / 50 a day
No cardSign in with Google, the key is shown once
£0

Upgrade later and the same key reaches further back. Nothing to re-integrate.

GET /v1/races/rc_7K2M9P
200 OK application/json 86 ms
{
  "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" }
}
book percentage price path casualty reasons dividends
578,321races
5.7Mrunner records
622,215horses with pedigree
36jurisdictions
60endpoints
Jan 2017first race on file

Most feeds hand you a result. This hands you the race.

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.

Musselburgh 7 September 2026   14:35   Class 4 Handicap Hurdle rc_7K2M9P

set in advance

Conditions

9 fields
Course
Musselburgh
Country
Scot
Region
GB
Run type
Hurdle
Distance
1m 4f
Going
Good to soft
Surface
Turf
Class
4
Age
4yo plus

at declaration

The card

14 fields
Declared
13
Non-runners
1
Cloth
1
Draw
—
Weight
11-5
Rating
119
Form
31/2-24
Headgear
Tongue strap
Days since run
25
Trainer
N & W Twiston-Davies
Jockey
S Twiston-Davies
Owner
G & A Jelley
Sire
King's Theatre
Damsire
Presenting

into the off

The market

8 fields
Starting price
15/8
Opening
7/4
Price path
7/4 6/4 13/8 7/4 15/8
Movements
op 7/4 tchd 6/4
Favourite
Global Stage
Market rank
2
Book percentage
112.4%
Forecast
2/1

at the line

The result

7 fields
Position
1
Beaten by
—
Margin to 2nd
¾ length
Casualties
1 pulled up
Winning time
5m 16.70s
Placed
3
Stage
Weighed in

after the weigh-in

Settled

6 fields
Tote win
£3.90
Exacta
£18.40
Trifecta
£64.20
Straight forecast
£5.20
Place pot
£41.90
Winner's prize
£4,547

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 docs

A strike rate on its own will lose you money.

win_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_pct

How 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_e

Actual wins against expected, where expected is the sum of implied probabilities from starting price. Above 1.00 beats the market.

pl_1pt

What one point on every runner would have returned, settled at starting price. The plainest answer to whether an angle has paid.

first … fourth

Positions come back separately rather than lumped into a placed count, so you apply your own terms, not ours.

Same block, however you slice it
coursedistancegoing surfaceclassfield_size drawlayoffmonth trainerjockeyowner sire
Complete + Analyst, $199 a month

Twenty-two jurisdictions, and exactly how deep each one goes.

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 detail

Every racing week since January 2017.

520 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).

578,321 races across 520 weeks and 36 jurisdictions hover the archive
9.8years, unbroken
578,321races, every one with its own market
5.7Mrunner records
622,215horses, with sire and damsire

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 pricing

65 endpoints, and the docs cannot drift from them.

One 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.

65endpoints across 10 groups
41on every paid plan
24statistics and analysis, on Complete + Analyst
2exports, OpenAPI and Postman

Reference & coverage

7
  • /v1/countries
  • /v1/courses
  • /v1/meta/coverage
  • /v1/search

+3 more

Race reports

2
  • /v1/reports
  • /v1/reports/{race_id}

Racecards & meetings

9
  • /v1/racecards/today
  • /v1/racecards/upcoming
  • /v1/meetings/{date}
  • /v1/results/latest

+5 more

Races & markets

7
  • /v1/races/search
  • /v1/races/{race_id}/result
  • /v1/races/{race_id}/market
  • /v1/races/{race_id}/dividends

+3 more

Horses & pedigree

8
  • /v1/horses/{horse_id}/form
  • /v1/horses/{horse_id}/pedigree
  • /v1/horses/{horse_id}/layoff
  • /v1/horses/compare

+4 more

Trainers

7
  • /v1/trainers/search
  • /v1/trainers/{trainer_id}/form
  • /v1/trainers/{trainer_id}/jockeys
  • /v1/trainers/{trainer_id}/courses

+3 more

Jockeys & owners

10
  • /v1/jockeys/{jockey_id}/form
  • /v1/jockeys/{jockey_id}/trainers
  • /v1/owners/{owner_id}/jockeys
  • /v1/owners/{owner_id}/courses

+6 more

Webhooks & account

3
  • /v1/webhooks/subscribe
  • /v1/webhooks/deliveries
  • /v1/account/usage

Courses & bias

Analyst 6
  • /v1/courses/{course_id}/draw-bias
  • /v1/courses/{course_id}/standard-times
  • /v1/courses/{course_id}/favourites
  • /v1/courses/{course_id}/casualties

+2 more

Market & analysis

Analyst 6
  • /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 spec

Priced by how far back you need to go.

Every 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.

Annual pays for ten months. Change plan mid-term either way.

Free key

Yesterday's racing, settled. No card.

$0

 

Reaches
yesterday only
Statistics
—
Rate
60 / min
Create a key

Live

Today's cards and results, for a site or an app.

$49 /month

 

Reaches
today + 3 days
Statistics
—
Rate
180 / min
Choose Live

Archive

The whole history, at research pace, for backtesting.

$99 /month

 

Reaches
back to 2017
Statistics
—
Rate
90 / min
Choose Archive
Most taken

Complete

History and live together, for a product in the wild.

$119 /month

Saves $29 a month

Reaches
2017 → upcoming
Statistics
—
Rate
180 / min
Choose Complete

Complete + Analyst

Strike rates, A/E and level stakes, already computed.

$199 /month

 

Reaches
2017 → upcoming
Statistics
24 endpoints
Rate
240 / min
Choose Analyst

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 key

Ninety seconds to your first result.

Sign 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.

Start on the free key. Move up when the window stops being enough. No card, no sales call, no trial that expires while you are still reading the docs. Upgrading widens the window on the key you already hold.