APIHorseRacing

Documentation / Guides

What a race carries

Forty four fields, in the order they become known.

A race accumulates information in stages, and knowing which stage a field arrives at explains most of the nulls you will see. Nothing here is missing; it either has not happened yet or was never published.

When it is declared

Known days before the race. The shape of the contest.

  • course, date, race_time, distance, run_type, surface
  • class, handicap, age_band, prize
  • Per runner: horse, trainer, jockey, owner, weight, draw, headgear, official_rating, form

draw is null in jumps racing by design. There is no stall, so there is no draw, and returning a zero would be worse than a null.

On the morning

  • going and weather, which belong to the meeting rather than the race and are returned once
  • Non-runners removed from the field
  • price_path.opening, where the jurisdiction published an opening price

At the off

  • sp and sp_decimal on every runner
  • book_percentage on the race, being those prices summed
  • favourite and market_position, both derived by us from the prices, because the source leaves them empty on a settled race
  • price_path.touched and price_path.drift

Once it has run

  • position on each runner, or null where the jurisdiction publishes only placings
  • casualty where a runner did not complete: PulledUp, Fell, UnseatedRider, BroughtDown, RefusedToRace or RanOut
  • winning_time, dividends, prizes
  • result_available flips true

Later still

Two things arrive on a separate pass behind the results crawl, because they live on the horse profile rather than on the race.

  • sire, dam and damsire
  • beaten_distance per runner

A null in either means the pass has not reached that horse yet, not that the value is unknown. Coverage climbs daily.

How to tell three kinds of null apart

This is the whole point of the guide.

You seeIt meansHow to confirm
position null, casualty set The horse did not complete The casualty reason is the confirmation
position null, casualty null, race settled The jurisdiction published placings only /v1/countries position_pct for that region
position null, result_available false Not run or not settled yet The race status
official_rating null Not published there, or outside 0–200 and dropped as a sentinel Coverage
price_path.opening null No opening price published price_path.source says which kind you have
sire null Pedigree pass has not reached this horse Re-fetch later; it will fill in

Fields we derive

Stated so you know what is ours rather than the source's.

  • sp_decimal, computed once at load so you are not parsing fractions per row
  • implied, one over the decimal price
  • book_percentage, those summed across the field
  • favourite and market_position, ranked on price with joint favourites sharing rank one
  • days_since_previous on a form line
  • expected on the statistics endpoints, which is implied normalised so a field sums to one rather than to the book percentage