OrbTop

Equibase Horse Racing Scraper - US Race Entries & Results

SPORTSBUSINESS

Equibase Horse Racing Scraper - US Race Entries & Results

Scrape North American Thoroughbred racing data from Equibase.com, the official statistics provider for the sport. Returns one record per race — entries (post position, horse, jockey, trainer, weight, morning-line odds), results (finish order, winning time, win/place/show payouts, exotics), and race conditions — for every track running on a given date.


Equibase Horse Racing Scraper Features

  • Returns the complete daily slate. Every track racing on the date, pulled from Equibase's own entries index — not a curated shortlist of the marquee cards.
  • Covers US and Canadian Thoroughbred tracks. Woodbine and Delta Downs get the same treatment as Saratoga.
  • Extracts 25+ fields per race — entries, results, payouts, and conditions in structured JSON.
  • One record per race, not per horse. The full field lives in a single entries string, so a race card is one row.
  • Three data modes: entries only, results only, or both.
  • Handles Equibase's Imperva bot protection internally. No proxy setup, no captcha wrangling — you pick a date and get data.
  • Scrapes any date. Today's cards, tomorrow's early entries, or a past date for completed results.

Who Uses Equibase Racing Data?

  • Handicappers — Build speed figures and pace models off entries, then check them against finish order and times.
  • Sports analytics platforms — Import every meeting for the day into a database without stitching together a dozen track sites.
  • Bettors and syndicates — Track odds movement and payouts across the full card, including the tracks nobody else bothers to cover.
  • Racing media and bloggers — Pull results and payouts for recaps the moment a card finishes.
  • Data vendors — Feed a normalized racing dataset into downstream products instead of maintaining scrapers per track.

How Equibase Horse Racing Scraper Works

  1. Pick a date (defaults to today) and a data mode. Leave the track filter empty to get everything.
  2. The scraper reads Equibase's authoritative entries index for that date — the full list of tracks running, US and Canadian.
  3. It clears the site's Imperva challenge once with a real browser session, then collects each track's race card.
  4. Entries are parsed into one record per race; results and payouts are attached for past races. You get clean JSON.

Input

{
  "raceDate": "07/11/2026",
  "trackCodes": [],
  "dataMode": "both",
  "maxItems": 500
}
Field Type Default Description
raceDate string today Date to scrape, MM/DD/YYYY or YYYY-MM-DD. Use a past date for completed results.
trackCodes array [] (all) Optional track-code filter (e.g. ["SAR", "GP", "WO"]). Empty scrapes every track racing that date.
dataMode string both entries (race cards), results (finish order + payouts), or both. Results exist only for past races.
maxItems integer 50 Max race records returned (one race = one record). Default samples several meetings; raise it (e.g. 500) to collect the entire day's slate.

To collect every race at every track for a day, leave trackCodes empty and set maxItems high enough to cover it — a busy US day runs 200–300 races across ~25 tracks.

{
  "raceDate": "07/11/2026",
  "trackCodes": ["SAR", "GP"],
  "dataMode": "results",
  "maxItems": 100
}

Equibase Horse Racing Scraper Output Fields

One record per race. Entry fields are always populated; result fields fill in once a race has run (results_available tells you which).

{
  "race_id": "SAR-2026-07-11-R8",
  "race_date": "2026-07-11",
  "track_code": "SAR",
  "track_name": "Saratoga",
  "race_number": 8,
  "race_name": "Allowance Optional Claiming",
  "race_type": "Allowance",
  "distance": "6 Furlongs",
  "distance_furlongs": 6.0,
  "surface": "Dirt",
  "track_condition": "Fast",
  "purse_usd": 90000,
  "post_time": "4:47 PM",
  "age_sex_restriction": "3yo+",
  "entries_count": 7,
  "entries": "1|Bold Venture|J. Rosario|C. Brown|122|5-2 | 2|Sea Foam|I. Ortiz Jr.|T. Pletcher|120|3-1",
  "results_available": true,
  "winner_horse": "Bold Venture",
  "winner_jockey": "J. Rosario",
  "winner_trainer": "C. Brown",
  "winning_time": "1:09.42",
  "finish_order": "1. Bold Venture (2), 2. Sea Foam (nk), 3. Grey Skies (1 1/4)",
  "win_payout": 7.20,
  "place_payout": 3.40,
  "show_payout": 2.80,
  "exotic_payouts": "{\"exacta\": 24.60, \"trifecta\": 98.75}",
  "entry_url": "https://www.equibase.com/static/entry/SAR071126USA-EQB.html",
  "result_url": "https://www.equibase.com/static/chart/summary/SAR071126USA-EQB.html",
  "scraped_at": "2026-07-11T20:15:00.000Z"
}
Field Type Description
race_id string Unique race identifier (track code + date + race number)
race_date string Race date in YYYY-MM-DD format
track_code string Short track code (e.g. SAR, GP, WO)
track_name string Full track name (e.g. Saratoga, Gulfstream Park, Woodbine)
race_number number Race number on the card (1–12+)
race_name string Race name or grade (e.g. Kentucky Derby, Allowance Optional Claiming)
race_type string Classification: Maiden, Allowance, Stakes, Claiming, etc.
distance string Distance description (e.g. 6 Furlongs, 1 1/8 Miles)
distance_furlongs number Distance in furlongs (decimal)
surface string Racing surface: Dirt, Turf, Synthetic, or All-Weather
track_condition string Track condition: Fast, Good, Sloppy, Muddy, Firm, Soft, Yielding
purse_usd number Total purse in US dollars
post_time string Scheduled post time (local track time)
age_sex_restriction string Eligibility restriction (e.g. 3yo+, F&M)
entries_count number Number of horses entered
entries string Pipe-delimited entry list: `post
results_available boolean Whether results are attached (false for future/today races)
winner_horse string Winning horse
winner_jockey string Winning jockey
winner_trainer string Winning trainer
winning_time string Official winning time (e.g. 1:09.42)
finish_order string Order of finish with margins: place. horse (margin)
win_payout number Win payout on a $2 bet
place_payout number Place payout on a $2 bet
show_payout number Show payout on a $2 bet
exotic_payouts string Exotic payouts as JSON: exacta, trifecta, superfecta, daily double, pick 3/4/5/6
entry_url string Equibase entry page URL for this track/date
result_url string Equibase result summary URL for this track/date
scraped_at string ISO timestamp when the record was scraped

FAQ

How do I scrape Equibase race data?

Equibase Horse Racing Scraper takes a date and returns every race running that day. Set raceDate, leave trackCodes empty to get all tracks, and pick a dataMode. It handles Equibase's bot protection for you, so there's nothing to configure beyond what you actually want.

Does the scraper return every track for the day?

Yes. Equibase Horse Racing Scraper reads Equibase's own entries index — the authoritative list of every meeting racing on the date — rather than a curated homepage feed, so small and Canadian tracks come through alongside the majors. Set maxItems high enough to cover the slate (a busy US day is 200–300 races) and leave the track filter empty.

Can I get just results, or just entries?

Equibase Horse Racing Scraper has a dataMode for that: entries, results, or both. Results only exist for races that have already run, so for past dates use results or both; for today's or tomorrow's cards, entries is what's available.

Do I need to configure proxies or solve captchas?

No. Equibase Horse Racing Scraper clears Equibase's Imperva bot protection internally — there's no proxy field to set and no captcha to solve. That's the part that makes most people give up on scraping Equibase, and it's handled.

How much does Equibase Horse Racing Scraper cost?

Equibase Horse Racing Scraper bills per race record on a pay-per-event basis — you pay for the races you actually collect, capped by maxItems. A single-track results run is a handful of records; a full-day pull across every track is a few hundred.


Need More Features?

Need a different field, an odds-history mode, or another racing data source? File an issue or get in touch.

Why Use Equibase Horse Racing Scraper?

  • Complete coverage — every track on the card, US and Canadian, from Equibase's own index.
  • Zero bot-protection hassle — it clears the Imperva challenge internally, which is more than you can say for pointing curl at Equibase and getting "Pardon Our Interruption."
  • Clean, one-row-per-race JSON — consistent field names for entries, results, and payouts, so the data goes straight into your model instead of a cleanup script.