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:
| Field | Why 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
- Building a site or an app: Racecards and meetings, then webhooks so you stop polling.
- Backfilling for research: race search with a cursor, or walk dates with the card endpoint, which is simpler.
- Testing an idea: angles, and read Understanding A/E first.