Skip to content

Equibase Horse Racing Scraper

Try for free

Scrape Equibase horse racing data for any date: race cards with every horse, jockey, trainer, owner and morning-line odds, results with finish order, times and win/place/show and exotic payouts, plus today's scratches and changes. All US and Canadian tracks.

🏇 Equibase Horse Racing Scraper

Get North American horse racing data from Equibase, the official source for US and Canadian Thoroughbred racing. Each race comes back as one clean record: the race card with every horse, jockey, trainer, owner and morning-line odds, then the result with finish order, final time and win/place/show and exotic payouts. Pick a date (or a date range), leave the track list empty, and you get every track that raced. No login, no account and nothing to install.

✨ Why use Equibase Horse Racing Scraper?

  • 🗓️ Every track, every race on a date: reads Equibase's own entries index, so small and Canadian tracks come through alongside Keeneland, Santa Anita and Gulfstream.
  • 🧾 Cards and results in one record: entries, scratches, order of finish, times, the full $2 win/place/show board and every exotic payout, joined per race.
  • 🐎 Deep horse detail: Equibase horse ids, sire, dam and dam sire, owner, breeder, medication, claiming price, apprentice allowance and coupled entries for every runner.
  • 📅 Date ranges: collect a whole week or month of results in one run (Equibase keeps about two months of results online).
  • 🔁 Race-day changes: today's scratches with reasons, jockey and weight changes, track conditions and rail settings, one record per change.
  • ⚡ Fast: a typical 20-race run finishes in about 20 seconds.

🎯 Use cases

  • 📈 Handicapping and betting models: build speed, pace and class models from cards, then score them against finish order and payouts.
  • 🧮 Payout and pool analysis: track exacta, trifecta, superfecta and pick-N payoffs across every track and day.
  • 📰 Racing media and newsletters: publish results and payouts for recaps as soon as a card finishes.
  • 🏢 Data products and dashboards: feed a normalized racing dataset into your own database instead of maintaining scrapers per track.
  • 🐴 Owner, trainer and breeder tracking: follow connections and horses with the optional horse history (career starts with Equibase speed figures and recent workouts).

🚀 How to use

  1. Open the actor and set Race date (yesterday, today, tomorrow or a date such as 2026-10-18).
  2. Optional: add Track codes (e.g. KEE, SA, GP, WO) or leave them empty for every track.
  3. Pick Data to collect: race cards and results, race cards only, results only, or race-day changes.
  4. Set Max records (a busy day has 200 to 300 races; 0 = no limit) and click Start.
  5. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

📥 Input

FieldWhat it does
raceDateDay to collect: YYYY-MM-DD, MM/DD/YYYY, today, yesterday, tomorrow or -3. Empty = today (US Eastern).
trackCodesEquibase track codes such as KEE, SA, GP, CD, WO. Empty = every track.
dataModeboth (cards and results), entries, results or late_changes (today's scratches and changes).
maxItemsMost records to save. 0 = no limit.
endDateLast day of a date range.
surfaces, breeds, minPurseUsd, maxPurseUsd, stakesOnlyFilters.
includeHorseHistory, maxHorseProfilesAdd one horse history record per runner.
{
  "raceDate": "2026-10-18",
  "trackCodes": ["KEE", "SA"],
  "dataMode": "both",
  "maxItems": 50
}

📤 Output

One record per race (record_type: "race"). Card fields are filled as soon as entries are posted; result fields fill in once the race has been run (results_available).

FieldDescription
race_idTrack, date and race number, e.g. KEE-2026-10-18-R8
track_code, track_name, track_countryTrack
race_number, race_name, race_type, breedRace
distance, distance_furlongs, surface, scheduled_surfaceDistance and surface (surface is where the race was run; scheduled_surface is the card's, so races taken off the turf are visible)
purse_usd, post_time, post_time_zone, off_timePurse and times
age_sex_restriction, conditions, wagersEligibility, full conditions and wagers offered
entries_count, entries, entries_detailStarters, as text and one object per horse (ids, pedigree, connections, odds, scratches, finish position)
scratched_horsesScratches with the reason
track_condition, winning_time, finish_order, finish_order_detailResult
winner_horse, winner_jockey, winner_trainer, winner_owner, winner_breeder, winner_sireWinner and connections
win_payout, place_payout, show_payout, payouts_by_horse$2 win/place/show prices
exotic_payouts, exotic_payouts_by_typeExacta, trifecta, superfecta, daily double, pick 3/4/5/6 and more
entry_url, result_url, scraped_atSources and time

Race-day changes (record_type: "late_change") carry change_type, change_text, old_value, new_value, reason and time_posted. Horse history (record_type: "horse_history") carries past_starts (with Equibase speed figures and a race_id that joins to race records), workouts, ratings, year_stats and career_stats.

Example race record (from a test run, trimmed to two horses; people's names replaced with fictional ones):

{
  "record_type": "race",
  "race_id": "LRL-2026-10-18-R1",
  "race_date": "2026-10-18",
  "track_code": "LRL",
  "track_name": "Laurel Park",
  "track_country": "USA",
  "race_number": 1,
  "race_name": "Maiden Claiming",
  "race_type": "Maiden Claiming",
  "breed": "Thoroughbred",
  "distance": "Five And One Half Furlongs",
  "distance_short": "5 1/2 F",
  "distance_furlongs": 5.5,
  "surface": "Dirt",
  "scheduled_surface": "Turf",
  "track_condition": "Fast",
  "purse_usd": 30000,
  "post_time": "12:00 PM",
  "post_time_zone": "ET",
  "age_sex_restriction": "2yo F",
  "entries_count": 5,
  "entries": "1|Kelly's Hardheaded (KY)|J Doe|A Smith|122|8/1 | 7|Hadid (PA)|M Rivera|P Jones|122|7/5",
  "entries_detail": [
    {
      "program_number": "7", "post_position": "7", "horse_name": "Hadid (PA)", "state_bred": "PA",
      "horse_refno": "11501091", "horse_registry": "T", "age_sex": "2/F", "medication": "L",
      "claim_price_usd": 25000, "jockey": "M Rivera", "trainer": "P Jones", "weight_lbs": 122,
      "ml_odds": "7/5", "owner": "Example Stable LLC", "breeder": "Jane Example", "sire": "Example Sire",
      "dam": "Example Dam", "dam_sire": "Example Damsire", "is_scratched": false, "finish_position": 1
    },
    {
      "program_number": null, "horse_name": "I Am King (KY)", "horse_refno": "11470130",
      "ml_odds": "20/1", "is_scratched": true, "scratch_reason": "Off-Turf"
    }
  ],
  "results_available": true,
  "winner_horse": "Hadid",
  "winner_program_number": "7",
  "winner_jockey": "Mario Rivera",
  "winner_trainer": "Peter Jones",
  "winning_time": "1:07.03",
  "finish_order": "1. Hadid, 2. Kelly's Hardheaded, 3. Last Hot Lover, 4. Her Decision, 5. Catty's Angel",
  "win_payout": 4.4,
  "place_payout": 3.4,
  "show_payout": 2.1,
  "exotic_payouts": "{\"exacta\":14.6,\"superfecta\":93.3,\"trifecta\":39.2}",
  "exotic_payouts_by_type": {
    "exacta": {"payoff": 14.6, "raw_label": "$1 Exacta", "wager_unit_usd": 1.0, "winning_numbers": "7-1",
               "payoffs": [{"payoff": 14.6, "winning_numbers": "7-1"}]}
  },
  "entry_url": "https://www.equibase.com/static/entry/LRL101826USA-EQB.html",
  "result_url": "https://www.equibase.com/static/chart/summary/LRL101826USA-EQB.html",
  "scraped_at": "2026-10-21T19:36:10.000Z"
}

💰 Pricing

Pay per event, plus platform usage:

  • $0.80 per 1,000 race records (one race card and/or result, or one race-day change)
  • $0.15 per run start
  • $0.80 per 1,000 horse profiles (only when Add horse history is on)

Worked examples, measured on test runs (platform usage is about $0.01 for a 20-race run):

  • 20 races ≈ $0.15 + $0.016 + $0.01 usage ≈ $0.18
  • a full busy day of 250 races ≈ $0.15 + $0.20 + usage ≈ $0.37
  • 1,000 races over a date range ≈ $0.15 + $0.80 + usage ≈ $1.01

You can cap any run with the maximum charge setting; the run stops cleanly when it is reached.

❓ FAQ

Is it legal to scrape Equibase? The actor reads only public pages anyone can open without an account. Check Equibase's terms of use for how you may use the data, especially commercially.

Do I need a login or a proxy? No. The default proxy setting works; race cards and results are read through a hosted browser with its own US connection.

How far back can I go? Results go back about two months and full race cards about 10 days; older dates fail fast with a clear message instead of costing you anything. Race cards are posted a few days ahead. Dates older than about a month take longer, because the scraper has to check each track for that day.

Why is a field empty? Results fields are empty for races not yet run, race_cancelled is only known for today's card and past races, and some tracks don't publish every detail (for example claiming prices in allowance races).

Why does surface differ from scheduled_surface? The race was moved, usually taken off the turf because of weather. surface is where it was actually run.

Can I schedule it or use the API? Yes. Schedule it daily (for example yesterday in results mode after the last post), or start runs through the API and read the dataset as JSON or CSV.

⚠️ Limits

  • North American tracks that Equibase publishes as static cards (US and Canada). Tracks that only appear on Equibase's mobile site, such as Camarero (Puerto Rico), are not covered.
  • History: results (finish order, times, payouts, winner connections) go back about two months; full race cards with every horse's jockey, trainer, owner, pedigree and odds are online for about 10 days. Older dates in "Race cards and results" mode return the result fields only.
  • Full charts with fractions and calls, past performances and pace figures are paid Equibase products and are not included.
  • Race-day changes exist for the current race day only.
  • Live odds are not included; the morning line is.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.