Thoroughbred racing data

Horse racing odds API from racecard to price board

Discover thoroughbred cards early, preserve runner identity through scratchings and begin polling or streaming prices inside the active collection window.

Thoroughbred racing dataWin & place
Example prices
Example decimal win and place odds for the same runners at two bookmakers
RunnerSportsbetLadbrokes
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.
REST snapshotSSE / WebSocket
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"
}

Thoroughbred-only discovery

Use race_type=horse-racing to return thoroughbred meetings without harness or greyhound events.

Horse and connection fields

Keep runner numbers beside horse, jockey and trainer names when those connection fields are supplied.

Non-runner-aware prices

Track win and place odds alongside explicit scratching, removal and adjustment fields.

When horse-racing odds collection starts

Racecard discovery and bookmaker price collection begin at different points in the race lifecycle.

Racecards can appear earlier

GET /v1/racing/events can return the scheduled meeting, race and declared field before active bookmaker price collection begins.

Prices start in the final 10 minutes

For an eligible scheduled race, the bookmaker collection window opens when the race enters the final 10 minutes before its advertised start time.

Use status and timestamps

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

A polling and streaming plan around the jump

Discover the card before the active price window, then switch from snapshot to updates without losing runner identity.

  1. T−30m

    Load the racecard

    Store event_id, runner_number and the advertised start. Odds rows may not be active yet.

  2. T−10m

    Request the first odds snapshot

    For an eligible scheduled race, active bookmaker collection begins in this final window.

  3. After snapshot

    Open SSE or WebSocket

    Persist resume, apply runner-price changes and reload the snapshot after resync.

  4. At the jump

    Stop treating the board as pre-match

    Use event status and current bookmaker rows; this product does not supply in-play racing prices.

Horse racing bookmakers

Compare the bookmakers returned for one thoroughbred race without trying to join horses by name across separate feeds.

Inspect horse racing responses
  • Sportsbet
  • Ladbrokes
  • PlayUp
  • PointsBet
  • Dabble
  • BetRight
  • Betr
  • Unibet

Thoroughbred country filters

Choose the country and time window at discovery. The odds response identifies which bookmakers are pricing that race.

CatalogueCodeRequest filter
Great BritainGBrace_country=GB
IrelandIErace_country=IE
AustraliaAUrace_country=AU
New ZealandNZrace_country=NZ

Horse racecard and odds fields

Keep the horse, its connections, race state and bookmaker price attached to one event and runner number.

Data groupAPI fieldsWhat 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.

From declarations to the jump

The racecard can change after publication. Preserve the same event and runner keys as horses, connections and prices update.

Read the horse racing contract
  1. Build the meeting card

    Filter by country and start window, then group races by venue and race number. Retain event_id for every later call.

    event_id
  2. Join horses and connections

    Use runner_number as the primary in-race key. Treat runner_name, jockey_name and trainer_name as display and validation fields.

    runner_number
  3. Process a non-runner

    Use explicit runner status, scratching and removal fields. Apply an adjustment factor only when the source supplies one.

    adjustment_factor
  4. Continue the price board

    Store resume after each snapshot or delta. Reload the REST snapshot when a stream sends resync before applying more changes.

    resume

How to use the horse racing API

Discover the thoroughbred card first, load its declared field, then attach bookmaker odds and price updates by event ID.

  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

Recommended entry point

Start with Starter at $30/month

Starter includes 50,000 base API credits, 60 requests per minute and one concurrent stream across the bookmakers and markets available to the account.

  • Good fit for racecards, pre-jump comparison boards, alerts and normalized runner-price products.
  • Use the event list before the price window so the customer interface is ready when odds collection starts.
  • Move to Builder at $90/month for 2 million base credits and eight concurrent streams.
Choose Starter

Poor fit

What this feed does not replace

The racing contract connects current race identity, runner state and pre-jump bookmaker prices. It is not a complete racing database.

  • It does not provide a historical form or pedigree database.
  • A published racecard does not mean the active bookmaker collection window has opened.
  • It does not place wagers or supply in-play racing prices.

Verification

Sources and fact date

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.

  1. Racing endpoint referenceRace discovery, event detail, odds snapshots, response fields and update routes.
  2. Live racing coverageCurrent countries, bookmakers and recently observed racing availability.
  3. Racing API overviewShared horse, harness and greyhound discovery and price contract.
  4. PricingMonthly credits, request limits and concurrent stream allowances.

Horse Racing API FAQs

Answers about thoroughbred filters, horse matching, jockey and trainer fields, non-runners and price updates.

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 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.