APIHorseRacing

Documentation / Guides

Your first four calls

What is running, one race, yesterday read back, and a real question.

Four requests that between them exercise everything this API does. Run them in order on a free key and you will have seen the envelope, the window, the identifiers and the honesty about coverage, which is most of what there is to learn.

1. What exists, and what you can reach

GET /v1/meta/coverage

No parameters, works on every plan. It returns the size of the archive, the split between races with a full finishing order and those with placings only, the list of things that do not exist here at all, and your own plan and window.

Read never_published before you build anything. Sectional times and bookmaker odds are not in this dataset and never will be. Better to learn that in your first request than your fiftieth.

2. What is running

GET /v1/racecards/2026-09-05

Pick a date inside your window. On a free key that means between one and seven days ago; on a paid plan, anything.

Races come back grouped into meetings, because that is how a card is read. Note that race_time is local to the course while everything else in the response is UTC. That is deliberate and it is the single most common integration mistake in racing data.

Take a race_id from the response. It looks like rc_1WNM9X2. The prefix tells you what kind of thing it is, which means passing a horse identifier where a race is expected gets you invalid_id rather than the wrong race.

3. One race in full

GET /v1/races/rc_1WNM9X2

Conditions, the market and every runner. Four fields here are worth finding immediately, because they are the ones a results feed does not have:

FieldWhy it matters
book_percentage What the field's implied probabilities summed to. 100 would be a fair book; the excess is the margin taken out.
price_path The opening price and any prices touched, with a source field saying which kind of history you have.
casualty Why a runner did not finish. Distinguishes a horse that pulled up from one whose jurisdiction publishes only placings.
official_rating The handicap mark, where the jurisdiction publishes one.

Several of those will be null depending on where the race was run. That is not a gap in the fetch. Data coverage has the measured figures per country.

4. A real question

GET /v1/analysis/angles?run_type=Chase&going=Soft&by=field_size&min_runs=100

This one needs Analyst, and it is the call worth understanding even if you never make it, because it is what the tier is for. Every filter combined freely, returning strike rate, A/E against the market, level stakes and a confidence interval, grouped however you ask.

Read the interval, not the headline. A row with an A/E of 1.30 and a range spanning 1.00 is not a finding, and the significant flag says so without you having to work it out.

Where to go from here