API reference
Documentation
63 REST endpoints over horse racing in eleven jurisdictions: racecards, results, starting prices, price movement, book percentages, horses, trainers, jockeys, owners and courses. Race data only. No predictions, no ratings, no betting advice.
Machine readable: OpenAPI 3.1 · Postman collection · Changelog. Both are generated from the same registry as these pages, so a client you generate cannot describe an endpoint that does not exist. Every endpoint page has a Run it live console; bring your key.
Quickstart
Base URL https://api.apihorseracing.com, your key in the
X-API-Key header, JSON back in a meta and data
envelope. This is the whole of it:
curl https://api.apihorseracing.com/v1/racecards/today \ -H "X-API-Key: $AHR_KEY"
$ch = curl_init('https://api.apihorseracing.com/v1/racecards/today'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('AHR_KEY')], ]); $data = json_decode(curl_exec($ch), true)['data'];
const res = await fetch( 'https://api.apihorseracing.com/v1/racecards/today', { headers: { 'X-API-Key': process.env.AHR_KEY } } ); const { meta, data } = await res.json();
import os, requests r = requests.get( "https://api.apihorseracing.com/v1/racecards/today", headers={"X-API-Key": os.environ["AHR_KEY"]}, ).json()
New here? Read Getting started, then Coverage by country and Errors. Those three are the difference between a call that works and an integration that behaves.
Guides
22Read these before the reference. They answer the questions the reference assumes you already know.
Start here3
Coverage & integrity4
Reading a response5
Statistics3
Limits & delivery7
Reference & coverage
7What exists, and how much of it. Call these before writing anything else.
/v1/countries
Jurisdictions
Every country in the archive with its race count and which fields it publishes.
GET
/v1/courses
Courses
Every course, with first and last meeting and how many races we hold.
GET
/v1/meta/coverage
Coverage
Totals, the full-order split, and what your own plan can read.
GET
/v1/search
Search everything
One lookup across horses, trainers, jockeys and courses.
GET
/v1/courses/{course_id}
Course profile
Run types, surfaces and distances actually raced there.
GET
/v1/reference
Filter values
Valid goings, classes and run types, counted from the data.
GET
/v1/meta/reports
Report coverage
How many race reports exist, from when, and for which jurisdictions.
Race reports
2A written account of every race, from the records themselves.
Racecards & meetings
7Today, tomorrow, and any day in the archive.
/v1/racecards/today
Today's cards
Every meeting and race today, grouped by course.
Live window
GET
/v1/racecards/upcoming
Upcoming
Declarations for the next few days.
Live window
GET
/v1/meetings/{date}
Meetings by date
One row per course on that day, with going and race count.
GET
/v1/results/latest
Latest results
The most recently settled races your plan can read.
Live window
GET
/v1/racecards/{date}
Card by date
The full card for any date, grouped into meetings.
GET
/v1/meetings/{meeting_id}
Meeting card
A meeting and every race on it.
GET
/v1/results/{date}
Results by date
Settled races for a date, grouped into meetings.
Races & markets
7One race, in as much detail as exists.
/v1/races/search
Search races
Filter by date, region, run type, going, class, field size. Cursor paginated.
Paged
GET
/v1/races/{race_id}/result
Finishing order
Finishing order, casualties, dividends and prize money.
GET
/v1/races/{race_id}/market
Market
Book percentage, every price, and what moved before the off.
GET
/v1/races/{race_id}/dividends
Dividends
Tote returns and prizes, where the jurisdiction published them.
GET
/v1/races/{race_id}
Race detail
Conditions, the market, and every runner with its price and position.
GET
/v1/races/{race_id}/runners
Field and runners
The field alone, without the race conditions.
GET
/v1/races/{race_id}/analysis
Race in context
Market shape, movers, and what this course and distance usually produces.
Horses & pedigree
8Form, breeding, and whether a horse is improving.
/v1/horses/{horse_id}/form
Form line
Recent runs, newest first, clipped to your window.
Paged
GET
/v1/horses/{horse_id}/pedigree
Breeding
Sire, dam and damsire, plus others by the same sire.
GET
/v1/horses/{horse_id}/layoff
After a break
Performance split by days since the last run.
Analyst
GET
/v1/horses/compare
Head to head
Every race these horses have both run in, and who finished ahead.
GET
/v1/horses/search
Search horses
By name, with career totals attached.
Paged
GET
/v1/horses/{horse_id}
Horse profile
Career record and breeding where it has been fetched.
GET
/v1/horses/{horse_id}/trend
Form trend
Each run measured against what the market expected of it.
Analyst
GET
/v1/horses/{horse_id}/stats
Statistics
The standard block, sliceable seventeen ways.
Analyst
Trainers
7A yard, and how it has actually paid.
/v1/trainers/search
Search trainers
By name.
Paged
GET
/v1/trainers/{trainer_id}/form
Recent runners
Newest first, with the price and the finish.
Paged
GET
/v1/trainers/{trainer_id}/jockeys
By jockey
Which riders have paid for this yard.
Analyst
GET
/v1/trainers/{trainer_id}/courses
By course
The slice that finds where a yard actually wins.
Analyst
GET
/v1/trainers/{trainer_id}
Trainer profile
Runs, wins and the horses sent out.
GET
/v1/trainers/{trainer_id}/stats
Statistics
Strike rate, A/E and level stakes, by any dimension.
Analyst
GET
/v1/trainers/{trainer_id}/owners
By owner
Split by who owns the horse.
Analyst
Jockeys & owners
10The same shapes as trainers, deliberately.
/v1/jockeys/{jockey_id}/form
Recent rides
Newest first.
Paged
GET
/v1/jockeys/{jockey_id}/trainers
By trainer
Which yards a rider does well for.
Analyst
GET
/v1/owners/{owner_id}/jockeys
By jockey
Riders used, and how they paid.
Analyst
GET
/v1/owners/{owner_id}/courses
By course
Where the colours have done well.
Analyst
GET
/v1/jockeys/search
Search jockeys
By name.
Paged
GET
/v1/jockeys/{jockey_id}
Jockey profile
Rides, wins and the span of them.
GET
/v1/jockeys/{jockey_id}/stats
Statistics
The standard block for a rider.
Analyst
GET
/v1/owners/search
Search owners
By name. Owners are identified by name; the source publishes no id.
Paged
GET
/v1/owners/{owner_id}
Owner profile
Runs, wins and horses.
GET
/v1/owners/{owner_id}/stats
Statistics
The standard block for an owner.
Analyst
Webhooks & account
3Being told, instead of asking.
Courses & bias
6What a track does to a race.
/v1/courses/{course_id}/draw-bias
Draw bias
Low, middle and high thirds of the field, per distance.
Analyst
GET
/v1/courses/{course_id}/standard-times
Standard times
Median winning time per distance, with the implausible ones counted.
Analyst
GET
/v1/courses/{course_id}/favourites
Favourites
How the market leader holds up here.
Analyst
GET
/v1/courses/{course_id}/casualties
Casualties
Non-completion rates by run type.
Analyst
GET
/v1/courses/{course_id}/stats
Course statistics
The standard block for everything run there.
Analyst
GET
/v1/courses/{course_id}/going-record
By going
How the ground changes what wins.
Analyst
Market & analysis
6The market itself, across the whole archive.
/v1/market/sp-performance
Price performance
What each price band has actually returned.
Analyst
GET
/v1/market/movers
Market movers
Whether money moving tells you anything.
Analyst
GET
/v1/market/overround
Book percentage
How fat the books have been, by field size and course.
Analyst
GET
/v1/analysis/angles
Ask your own question
Every filter combined freely, returning the standard block.
Analyst
GET
/v1/analysis/layoff
Days since last run
Performance by days since the last run, across everything.
Analyst
GET
/v1/analysis/precedents
Precedents
Races that ran under matching conditions.
Analyst