Thoroughbred-only discovery
Use race_type=horse-racing to return thoroughbred meetings without harness or greyhound events.
Discover thoroughbred cards early, preserve runner identity through scratchings and begin polling or streaming prices inside the active collection window.
| Runner | ||
|---|---|---|
4Horse FourJockey FourTrainer Four |
3.40Win1.65Place | 3.55Win1.70Place |
7Horse SevenJockey SevenTrainer Seven |
5.20Win2.05Place | 5.00Win1.95Place |
items[].runners[]Same runner. Two bookmakers.GET /v1/racing/events/{event_id}/odds
Example compact response
{
"event_id": "HORSE_RACE_ID",
"as_of_ts_ms": 1788411600000,
"items": [
{
"bookmaker_name": "sportsbet",
"runners": [
{ "runner_number": "4", "runner_name": "Horse Four", "jockey_name": "Jockey Four", "trainer_name": "Trainer Four", "win_odds": 3.40, "place_odds": 1.65 },
{ "runner_number": "7", "runner_name": "Horse Seven", "jockey_name": "Jockey Seven", "trainer_name": "Trainer Seven", "win_odds": 5.20, "place_odds": 2.05 }
]
},
{
"bookmaker_name": "ladbrokes",
"runners": [
{ "runner_number": "4", "runner_name": "Horse Four", "jockey_name": "Jockey Four", "trainer_name": "Trainer Four", "win_odds": 3.55, "place_odds": 1.70 },
{ "runner_number": "7", "runner_name": "Horse Seven", "jockey_name": "Jockey Seven", "trainer_name": "Trainer Seven", "win_odds": 5.00, "place_odds": 1.95 }
]
}
],
"resume": "1788411600000-0"
}
Use race_type=horse-racing to return thoroughbred meetings without harness or greyhound events.
Keep runner numbers beside horse, jockey and trainer names when those connection fields are supplied.
Track win and place odds alongside explicit scratching, removal and adjustment fields.
Racecard discovery and bookmaker price collection begin at different points in the race lifecycle.
GET /v1/racing/events can return the scheduled meeting, race and declared field before active bookmaker price collection begins.
For an eligible scheduled race, the bookmaker collection window opens when the race enters the final 10 minutes before its advertised start time.
Treat the current event status, as_of_ts_ms and bookmaker rows as authoritative. A listed racecard does not guarantee that every bookmaker is already pricing the race.
Operational timing
Discover the card before the active price window, then switch from snapshot to updates without losing runner identity.
Store event_id, runner_number and the advertised start. Odds rows may not be active yet.
For an eligible scheduled race, active bookmaker collection begins in this final window.
Persist resume, apply runner-price changes and reload the snapshot after resync.
Use event status and current bookmaker rows; this product does not supply in-play racing prices.
Compare the bookmakers returned for one thoroughbred race without trying to join horses by name across separate feeds.
Choose the country and time window at discovery. The odds response identifies which bookmakers are pricing that race.
| Catalogue | Code | Request filter |
|---|---|---|
| Great Britain | GB | race_country=GB |
| Ireland | IE | race_country=IE |
| Australia | AU | race_country=AU |
| New Zealand | NZ | race_country=NZ |
Keep the horse, its connections, race state and bookmaker price attached to one event and runner number.
| Data group | API fields | What it covers |
|---|---|---|
| Race identity | event_idrace_venuerace_number |
One race reference connecting the meeting venue, card number, racecard and odds requests. |
| Card and start | race_start_timerace_distancerace_statestatus |
Unix start time, advertised distance, jurisdiction state and current race status. |
| Horse and connections | runner_numberrunner_namejockey_nametrainer_name |
The declared horse and its supplied jockey and trainer metadata inside the racecard. |
| Non-runners and deductions | runner_statusis_scratchedremoval_dateadjustment_factor |
Explicit signals for a withdrawn horse and any source-supplied price adjustment factor. |
| Bookmaker market | bookmaker_namewin_oddsplace_odds |
Decimal win and place prices for each priced runner, grouped by bookmaker. |
| Freshness and continuity | as_of_ts_msupdated_at_tsresume |
Snapshot time, an optional bookmaker timestamp when source metadata is requested, and the continuation token for supported updates. |
Use the canonical race_type=horse-racing value. Legacy aliases such as horse and thoroughbred remain normalized for backward compatibility.
The racecard can change after publication. Preserve the same event and runner keys as horses, connections and prices update.
Filter by country and start window, then group races by venue and race number. Retain event_id for every later call.
event_id
Use runner_number as the primary in-race key. Treat runner_name, jockey_name and trainer_name as display and validation fields.
runner_number
Use explicit runner status, scratching and removal fields. Apply an adjustment factor only when the source supplies one.
adjustment_factor
Store resume after each snapshot or delta. Reload the REST snapshot when a stream sends resync before applying more changes.
resume
Discover the thoroughbred card first, load its declared field, then attach bookmaker odds and price updates by event ID.
Request the next horse races and keep the event_id, start time, venue and race number needed by your product.
GET /v1/racing/events?race_type=horse-racing&status=fetching&limit=25
Read the current runners, race distance, start time and available connection metadata before showing the market.
GET /v1/racing/events/{event_id}
Group items by bookmaker_name and match the same horse by runner_number inside items[].runners[].
GET /v1/racing/events/{event_id}/odds
Continue from resume for supported price changes and reload the snapshot whenever the stream requests a resync.
SSE or WebSocket
Recommended entry point
Starter includes 50,000 base API credits, 60 requests per minute and one concurrent stream across the bookmakers and markets available to the account.
Poor fit
The racing contract connects current race identity, runner state and pre-jump bookmaker prices. It is not a complete racing database.
Verification
The timing and field definitions below are grounded in the current public endpoint contract and product pages.
Product contract verified 12 September 2026. Current bookmaker rows and event status remain authoritative for a specific race.
Answers about thoroughbred filters, horse matching, jockey and trainer fields, non-runners and price updates.
Use race_type=horse-racing on GET /v1/racing/events. Legacy horse and thoroughbred aliases are normalized, but horse-racing is the canonical value for new integrations.
Keep every horse inside its event_id and join bookmaker rows on runner_number. Use runner_name as a display and validation field rather than the primary key.
The compact runner model can include jockey_name and trainer_name when those fields are supplied. Your application should allow either field to be absent without dropping the horse or its price.
Use runner_status, is_scratched and removal_date when present. Do not infer a non-runner from one missing bookmaker price, and use adjustment_factor only when supplied.
Yes. Load the odds snapshot first, then connect to its SSE or WebSocket route and continue from the latest resume token. Reload the snapshot after a resync event.
For an eligible scheduled race, bookmaker price collection starts when the race enters the final 10 minutes before its advertised start. The racecard can appear in event discovery earlier, so use the event status and current odds response to confirm active prices.