Horse racing odds API

Horse racecards, scratchings and win/place odds from 11 bookmakers plus Betfair exchange, delivered over REST, SSE and WebSocket.

11 bookmakers

Plus Betfair exchange. Australia, New Zealand, Great Britain and Ireland.

Bookmaker coverage
  • Sportsbet
  • Ladbrokes
  • PlayUp
  • PointsBet
  • Dabble
  • BetRight
  • Betr
  • Unibet
  • Sky Bet
  • William Hill
  • Paddy Power
  • Betfair Exchange

REST response latency

See live status

Median and p95 from the public status feed.

API status

Near-start checks

0.75–4s

Scheduled check pauses. Sportsbet uses push.

Scrape times

Horse racing market types

Win & place

Decimal prices by runner and bookmaker.

Market details

win_odds and place_odds. Place terms come from the bookmaker. Exotics, in-play prices and results are not included.

Scrape times before the jump

Price collection opens 24 hours before start. Checks speed up in the final 10 minutes.

  1. 10–5 minutes to start4 seconds
  2. 5–2 minutes to start2 seconds
  3. 2–1 minutes to start1 second
  4. Final minute0.75 seconds
Collection details

Check pauses for Ladbrokes, PlayUp, PointsBet, Dabble, BetRight, Betr and Unibet.

Time or sourceConfigured timingApplies to
UK bookmaker checks2 secondsSky Bet, William Hill and Paddy Power in the near-start window.
SportsbetPush-based collectionThe next collection request follows the source's long-poll response.
More than 1 hour before start30 minutesEarly collection inside the 24-hour window.
1 hour to 12 minutes before start10 minutesEarly collection before the near-start handover.

These are configured pauses between collection cycles, not guaranteed quote ages. Source response time and pacing add to the cycle; PlayUp requests have a minimum 1.5-second spacing. Collection settings checked 16 October 2026.

REST latency measures an API request, not the time since a bookmaker changed its price. Use source timestamps for quote age.

Compare the same horse

Match bookmaker prices using runner_number.

Illustrative response · decimal prices

4Horse Four
Illustrative prices for runner 4
BookmakerWinPlace
Sportsbet3.401.65
Ladbrokes3.551.70
Racing API reference
GET /v1/racing/events/{event_id}/odds
{
  "event_id": "HORSE_RACE_ID",
  "as_of_ts_ms": 1788411600000,
  "items": [
    {
      "bookmaker_name": "sportsbet",
      "runners": [{
        "runner_number": "4",
        "runner_name": "Horse Four",
        "win_odds": 3.40,
        "place_odds": 1.65
      }]
    },
    {
      "bookmaker_name": "ladbrokes",
      "runners": [{
        "runner_number": "4",
        "runner_name": "Horse Four",
        "win_odds": 3.55,
        "place_odds": 1.70
      }]
    }
  ],
  "resume": "1788411600000-0"
}

Horse racecard and odds fields

DataFieldsUse in your app
Race identityevent_idrace_venuerace_numberOne race reference connecting the meeting venue, card number, racecard and odds requests.
Card and startrace_start_timerace_distancerace_statestatusUnix start time, advertised distance, jurisdiction state and current race status.
Horse and connectionsrunner_numberrunner_namejockey_nametrainer_nameThe declared horse and its supplied jockey and trainer metadata inside the racecard.
Non-runners and deductionsrunner_statusis_scratchedremoval_dateadjustment_factorExplicit signals for a withdrawn horse and any source-supplied price adjustment factor.
Bookmaker marketbookmaker_namewin_oddsplace_oddsDecimal win and place prices for each priced runner, grouped by bookmaker.
Freshness and continuityas_of_ts_msupdated_at_tsresumeSnapshot time, an optional bookmaker timestamp when source metadata is requested, and the continuation token for supported updates.

Filter by race country

  • Great Britainrace_country=GB
  • Irelandrace_country=IE
  • Australiarace_country=AU
  • New Zealandrace_country=NZ

How to use the horse racing API

  1. Find upcoming thoroughbred races

    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
  2. Load the declared field

    Read the current runners, race distance, start time and available connection metadata before showing the market.

    GET /v1/racing/events/{event_id}
  3. Compare win and place prices

    Group items by bookmaker_name and match the same horse by runner_number inside items[].runners[].

    GET /v1/racing/events/{event_id}/odds
  4. Follow market movement

    Continue from resume for supported price changes and reload the snapshot whenever the stream requests a resync.

    SSE or WebSocket

Odds API Pricing

Best for first builds

Starter

250K
$50 USD / month

Odds

Requests
250K / month
Streams
500 stream-hours / month
Stream connections
3 concurrent
  • All Bookmakers
  • All Markets
  • 120 requests/min
  • Self-serve

Bets

  • Positive EV and arbitrage bets
  • Up to 4 bookmakers
Best value

Builder

2M
$90 USD / month

Odds

Requests
2M / month
Streams
1,500 stream-hours / month
Stream connections
8 concurrent
  • All Bookmakers
  • All Markets
  • 300 requests/min
  • Email support

Bets

  • Positive EV and arbitrage bets
  • Up to 6 bookmakers

Live

20M
$250 USD / month

Odds

Requests
20M / month
Streams
6,000 stream-hours / month
Stream connections
25 concurrent
  • All Bookmakers
  • All Markets
  • 600 requests/min
  • Priority email

Bets

  • Positive EV and arbitrage bets
  • Up to 15 bookmakers

Pro

75M
$500 USD / month

Odds

Requests
75M / month
Streams
20,000 stream-hours / month
Stream connections
75 concurrent
  • All Bookmakers
  • All Markets
  • 1,200 requests/min
  • Priority email plus onboarding

Bets

  • Positive EV and arbitrage bets
  • Up to 50 bookmakers

Enterprise grade

Custom feeds and models

Custom projects, scoped with your team.

Models and configurations

  • Custom fair-price models
  • Private +EV and arbitrage feeds
  • Separate brand configurations

Delivery and data

  • Managed feed delivery
  • Custom schemas and ID mapping
  • Research datasets and exports
  • Bookmaker and market coverage projects

Horse Racing API FAQs

Which bookmakers are included in the horse racing API?

The horse racing catalog includes 11 fixed-odds bookmakers: Sportsbet, Ladbrokes, PlayUp, PointsBet, Dabble, BetRight, Betr, Unibet, Sky Bet, William Hill and Paddy Power, plus Betfair exchange. Prices are grouped by source and joined to the field using event ID and runner number.

Which horse racing markets does the API return?

The normalized racing response returns separate decimal win_odds and place_odds for each priced runner. Keep the source's place terms with each offer when comparing place prices.

How often are horse racing prices collected?

Earlier collection checks every 30 minutes, tightening to every 10 minutes from one hour to 12 minutes before start. In the final 10 minutes, configured pauses for the Australian request bookmakers tighten from 4 seconds to 0.75 seconds; PlayUp has a minimum 1.5-second request spacing. Sky Bet, William Hill and Paddy Power use 2-second near-start pauses. Sportsbet uses push-based collection. These are collection settings, while actual price age is read from source timestamps.

How do I request only thoroughbred horse races?

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.

How do I match the same horse across bookmakers?

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.

Does the racecard include jockey and trainer names?

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.

How should I handle a withdrawn horse?

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.

Can I stream horse racing odds?

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.

When does odds-api start collecting horse-racing prices?

For an eligible scheduled race, bookmaker price collection starts 24 hours 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.