APIHorseRacing

Data coverage

Read this before you subscribe, not after.

Every number here is counted from the archive as it stands, not declared in a config file, so it cannot flatter us and it corrects itself as more races land. Where we are thin, this page says so.

Most data pages are a list of what a vendor would like you to believe they have. This one is generated from the database itself: every figure below, down to the last cell of the field table, is a count taken at the moment you loaded the page. If a jurisdiction is thin, the number says so, and we would rather you found out here than three weeks into building on it.

The market, on every race counted, not claimed
98% of races carry a starting price
97% carry the book they were struck at
18% carry the opening price and the move

Strip the book out of a starting price and you have a fair probability. That is what every A/E figure on this API is measured against.

474,957races loaded
4,677,535runner records
11jurisdictions
2017–2026 loaded so far, backfilling forward

More than half the archive is the weaker kind.

A full finishing order means every runner carries a position. Placings only means the first four home are published and nothing below them, so most of the field comes back with position: null. That is not a gap in our data. It is what the jurisdiction released, and no feed can give you what was never published.

232,856full finishing order
242,101placings only
Every runner has a position, a casualty reason where one applies First four home, nothing recorded below them

Eleven jurisdictions, and what each one publishes.

Ordered by what we hold rather than by what sounds impressive, which is why United States is first and also the weakest. Ratings, class and winning times are marked where that jurisdiction actually publishes them.

USA placings only

United States

240,146races

2,066,129 runner records

64% of runners carry a finishing position

Ratings Class Times
GB full order

Great Britain

101,070races

975,469 runner records

83% of runners carry a finishing position

Ratings Class Times
FR full order

France

80,596races

970,824 runner records

81% of runners carry a finishing position

Ratings Class Times
IRE full order

Ireland

26,471races

353,733 runner records

79% of runners carry a finishing position

Ratings Class Times
RSA full order

South Africa

14,198races

159,096 runner records

84% of runners carry a finishing position

Ratings Class Times
HK full order

Hong Kong

4,383races

59,221 runner records

89% of runners carry a finishing position

Ratings Class Times
UAE full order

United Arab Emirates

2,032races

25,274 runner records

89% of runners carry a finishing position

Ratings Class Times
IND full order

India

2,011races

19,698 runner records

88% of runners carry a finishing position

Ratings Class Times
GER sparse

Germany

1,955races

19,077 runner records

44% of runners carry a finishing position

Ratings Class Times
NIR full order

Northern Ireland

1,566races

18,675 runner records

77% of runners carry a finishing position

Ratings Class Times
BR full order

BR

529races

4,521 runner records

84% of runners carry a finishing position

Ratings Class Times
Full finishing order Placings only Sparse, still filling

Which fields exist where.

The table that decides whether this data can answer your question. A field is not missing because we failed to fetch it; it is missing because that jurisdiction does not publish it, and no provider has it either. Every cell is counted, not claimed.

Field USA GB FR IRE RSA HK
Finishing positionevery runner, not just the placings 64% 83% 81% 79% 84% 89%
Starting pricefractional and decimal 100% 97% 100% 98% 98%
Casualty reasonpulled up, fell, unseated, refused yes yes
Opening price and movementwhere the source published one 66% 61%
Official ratingthe handicap mark 84% 77% <1% 64% <1% 50%
Race classa British idea, largely absent elsewhere 100% 5% 7% <1% <1%
Winning time 24% 95% 28% 96% 39% 50%
Tote dividends and prize money 97% 96% 99% 97% 93% 98%
Drawflat racing only, null in jumps by design yes yes yes yes yes yes
Headgearblinkers, cheekpieces, tongue tie yes yes yes yes yes yes
Sire, dam and damsirefilling in behind the results crawl 20% 28% 7% 22% 18% <1%
Sectional timesdo not exist in this dataset, anywhere never never never never never never
60%+Published on most runners 5–59%Partial, and the payload says which runners have it Not published in that jurisdiction A percentage is the share of that country's runners carrying the field. yes marks a field that is published where it applies but whose rate is a fact about racing rather than about coverage, such as how often a runner fails to complete. Counted at the last data load.

Three things that do not exist here.

The most common reasons this turns out to be the wrong feed. Better you know now than after a card payment.

No sectional times

None exist in this dataset at any point in its history, in any jurisdiction. If your model needs in-running fractions, stop reading and look elsewhere.

No bookmaker odds comparison

Starting price, an opening price where one was published, and the tote. We are not a price aggregator and never will be.

No predictions, tips or ratings

We supply data and take no view on any race. What you conclude from it is entirely your business.

What varies, and where it bites.

These are the differences that otherwise get discovered in production. Each is linked from the endpoints it affects, so the documentation states it in place rather than leaving it here.

Not every jurisdiction publishes a full finishing order

America publishes the placings and nothing below them, so position is null for most of the field. Britain, Ireland, France and South Africa carry a position for the great majority of runners. /v1/countries returns the current figure for each.

Draw exists in flat racing only

A null draw in a hurdle or a chase is correct, not missing. Filter on run_type before drawing conclusions from stall data.

Official ratings are not universal

Britain, Ireland and America carry a rating on roughly three quarters of runners. France and Germany carry one on about three percent. Values outside 0 to 200 are dropped, because the source returns sentinels there rather than ratings.

Race class is a British idea

Class is published in Britain and reliably absent elsewhere. Do not treat a null class as an ungraded race.

Winning times are patchy outside Britain and Ireland

Where a time exists it is as published. /v1/courses/{id}/standard-times reports the median per distance and counts the implausible ones rather than quietly serving them.

Tote dividends are published in some jurisdictions and not others

An absent dividend is a fact about the race rather than a gap in the data, and the endpoint says so instead of returning an error.

Price movement is an opening price, not a full series

The source publishes no odds history on a settled race, only an opening price and any prices touched. About one runner in five carries one. price_path.source tells you which kind you have on every runner, so you never have to infer it.

Run type is filled in behind the results crawl

The code a race was run under lives on the horse profile rather than the race, so it arrives on a later pass. A null run_type means not yet fetched, not unclassified.

Beaten distances arrive with the pedigree pass

They are published on the horse profile rather than the result page, so they fill in behind the main crawl.

There are no sectional times

None exist in this dataset at any point in its history. If your model needs in-running fractions, this is not the feed for it, and we would rather you knew now.

Check it from your code, not from this page.

Everything above comes from two endpoints, so your code can decide what it can trust instead of assuming. Both are on every plan, including the free key.

GET /v1/meta/coverage  —  totals, the split, and what your plan reads
GET /v1/countries     —  the 11 cards above, per jurisdiction

The archive is still loading. The backfill runs from January 2017 forward and has reached September 2026. Every figure here grows daily until it catches up, and none of it is withheld from any plan. Japan is not covered at all.