Horse racing data API
Horses data, from 2017 through one keyHorse racing racecards for today and the days ahead, results with every finisher and starting price, horse form, jockeys and trainers with their figures, and every course held, close to 700 of them.
Endpoints
Everything horses answers
Each one opens in the docs with a live console, your key already filled in.
| Method | Address | What it gives | Free key | |
|---|---|---|---|---|
| GET | /v1/horses/cards/today | Today's racecards with every runner | Plan | Try it |
| GET | /v1/horses/cards/upcoming | Races declared for the coming days | Plan | Try it |
| GET | /v1/horses/results | Results by date with every finisher and starting price | Yesterday | Try it |
| GET | /v1/horses/races/{id} | One race with every runner, its draw, weight, jockey and price | Yesterday | Try it |
| GET | /v1/horses/horses/{id}/form | A horse's runs, newest first | Yesterday | Try it |
| GET | /v1/horses/jockeys/{id} | A jockey and their figures | Yesterday | Try it |
| GET | /v1/horses/trainers/{id} | A trainer and their figures | Yesterday | Try it |
| GET | /v1/horses/courses | Every course held, with its location | Yesterday | Try it |
| GET | /v1/horses/search | Horses, jockeys, trainers and courses by name | Yesterday | Try it |
A real answer
What comes back
Kept from the API each night, exactly as a caller receives it, lists cut to a few rows.
{
"data": [
{
"meeting_id": "hr_qxyey1mz1b",
"course_id": "hr_e891c9va9h",
"course": "Agen La Garenne",
"country": "FRA",
"region": "FR",
"date": "2026-11-02",
"going": null,
"surface": null,
"races": [
{
"race_id": "hr_jzhrfaj33b",
"meeting_id": "hr_qxyey1mz1b",
"course": "Agen La Garenne",
"time": "12:40",
"off_time": null,
"name": "Prix Pierre Pujol (Gr.a)",
"run_type": "Trot",
"class": null,
"distance": "2575m",
"going": null,
"surface": null,
"handicap": false,
"runners": 16,
"result_available": true
},
{
"race_id": "hr_ewyjpav56j",
"meeting_id": "hr_qxyey1mz1b",
"course": "Agen La Garenne",
"time": "13:10",
"off_time": null,
"name": "Prix Raymond Esclapez (Gr.b)",
"run_type": "Trot",
"class": null,
"distance": "2575m",
"going": null,
"surface": null,
"handicap": false,
"runners": 16,
"result_available": true
},
{
"race_id": "hr_4k7drnaqcq",
"meeting_id": "hr_qxyey1mz1b",
"course": "Agen La Garenne",
"time": "13:40",
"off_time": null,
"name": "Prix Alain Chadourne",
"run_type": "Trot",
"class": null,
"distance": "2575m",
"going": null,
"surface": null,
"handicap": false,
"runners": 7,
"result_available": true
}
]
},
{
"meeting_id": "hr_hp3jk09721",
"course_id": "hr_6kr681dtjd",
"course": "Ballarat",
"country": "AUS",
"region": "AUS",
"date": "2026-11-02",
"going": "Soft 7",
"surface": "Turf",
"races": [
{
"race_id": "hr_072cz9a0xq",
"meeting_id": "hr_hp3jk09721",
"course": "Ballarat",
"time": "02:30",
"off_time": null,
"name": "Manhari 3YO Maiden Plate",
"run_type": "Flat",
"class": null,
"distance": "1600m",
"going": "Soft 7",
"surface": "Turf",
"handicap": false,
"runners": 7,
"result_available": true
},
{
"race_id": "hr_77h43jpm5z",
"meeting_id": "hr_hp3jk09721",
"course": "Ballarat",
"time": "03:00",
"off_time": null,
"name": "AC Accounting Maiden Plate",
"run_type": "Flat",
"class": null,
"distance": "1000m",
"going": "Soft 7",
"surface": "Turf",
"handicap": false,
"runners": 6,
"result_available": true
},
{
"race_id": "hr_xf08mcp1pe",
"meeting_id": "hr_hp3jk09721",
"course": "Ballarat",
"time": "03:30",
"off_time": null,
"name": "Winning Edge Presentations - Emerging Stars Series Heat 5",
"run_type": "Flat",
"class": null,
"distance": "1200m",
"going": "Soft 7",
"surface": "Turf",
"handicap": false,
"runners": 10,
"result_available": true
}
]
}
],
"meta": {
"sport": "horses",
"endpoint": "/results",
"count": 24,
"as_of": "2026-11-03T04:22:33+00:00",
"cached": false,
"age_seconds": 0
}
}{
"data": [
{
"course_id": "hr_e6rczatt3p",
"name": "Gulfstream",
"shortcode": null,
"country": "USA",
"region": "USA",
"races": 19657,
"meetings": 1935,
"first_meeting": "2015-09-07",
"last_meeting": "2026-11-01",
"town": null,
"county": null,
"nation": null,
"lat": null,
"lng": null,
"direction": null,
"kinds": []
},
{
"course_id": "hr_d40vvwsg7c",
"name": "Charles Town",
"shortcode": null,
"country": "USA",
"region": "USA",
"races": 12933,
"meetings": 1585,
"first_meeting": "2015-05-09",
"last_meeting": "2026-10-31",
"town": null,
"county": null,
"nation": null,
"lat": null,
"lng": null,
"direction": null,
"kinds": []
}
],
"meta": {
"sport": "horses",
"endpoint": "/courses",
"count": 734,
"as_of": "2026-11-03T04:22:33+00:00",
"cached": false,
"age_seconds": 0
}
}{
"data": [
{
"cloth": 1,
"draw": 5,
"horse_id": "hr_mv1aytcng0",
"horse": "Magnificent Malcom",
"age": 3,
"weight": null,
"official_rating": 58,
"form": "7x644x840",
"headgear": null,
"owner": "T Blechynden, J Krispyn, M Brown, C N Myles, A J Dingle, B A Sampey, S Trevena, S N Jones, D Fahey, A Fahey, S Eastman, D Wallinger, Mrs S Wallinger, J Offer, L Simmonds, P Rakowski, P Drysdale & B D Fletcher",
"owner_id": "hr_b23d6qkvkx",
"trainer_id": "hr_pgfhcbg4gh",
"trainer": "Joshua Krispyn",
"jockey_id": "hr_bbemvweyvw",
"jockey": "Jarrad Noske",
"silk": "Red, Green Strips, Black Sleeves, Green Cuffs, Black Cap",
"sp": null,
"sp_decimal": null,
"price_path": {
"opening": null,
"opening_decimal": null,
"touched": null,
"sp": null,
"sp_decimal": null,
"drift": null
},
"favourite": false,
"market_position": null,
"position": null,
"beaten_distance": null,
"casualty": null,
"run_status": "unknown",
"last_run_days": null,
"speed_figure": null,
"breeding": null,
"handicap_mark": null
},
{
"cloth": 2,
"draw": 1,
"horse_id": "hr_6smpzmw7p3",
"horse": "Heza Hellraiser",
"age": 3,
"weight": null,
"official_rating": 57,
"form": "868x",
"headgear": null,
"owner": "Ms N M Yozzi, Mrs J Kersley, Ms T Glazbrook, Ms M C Cornick, Mrs P Prouse, Mrs B Fisher, Mrs E Harper, Ms b D'Crus, Mrs D Sartorelli, Mrs E Yozzi, Ms V Sewell, Mrs V Bishop, Mrs L Pope, Ms K Jackman, Miss J Summerville, Ms C Hunter, Mrs J T Barton & Miss E G Van Den Broeke",
"owner_id": "hr_ddy4hje79q",
"trainer_id": "hr_k74d3rcs65",
"trainer": "Brian Kersley",
"jockey_id": "hr_59v53m4vje",
"jockey": "Jessica Gray",
"silk": "Dark Blue, Gold Collar, Cuffs And Cap",
"sp": null,
"sp_decimal": null,
"price_path": {
"opening": null,
"opening_decimal": null,
"touched": null,
"sp": null,
"sp_decimal": null,
"drift": null
},
"favourite": false,
"market_position": null,
"position": null,
"beaten_distance": null,
"casualty": null,
"run_status": "unknown",
"last_run_days": null,
"speed_figure": null,
"breeding": null,
"handicap_mark": null
}
],
"meta": {
"sport": "horses",
"endpoint": "/races/{id}",
"count": 8,
"as_of": "2026-11-03T04:23:04+00:00",
"cached": false,
"age_seconds": 0
}
}Goes well with
Sports often taken with horses
Can I try horses before I pay?
Yes. The free key reads yesterday's horses data on every endpoint except live and fixtures, 50 calls a day, no card.
What does the Horses plan include?
Every horses endpoint, live and upcoming included, the full history we hold, 120 calls a minute and 250,000 a month, for $79 a month or $790 a year.
Does it answer like the other sports?
Yes. Horses answers in the same shape as every other sport, through the same key, so code written for one reads the rest.
Can I use it with Claude?
Yes. The MCP server turns each horses endpoint into a tool, on the same key.