Equibase Scraper | Horse Racing Entries and Results avatar

Equibase Scraper | Horse Racing Entries and Results

Pricing

from $0.81 / 1,000 runners

Go to Apify Store
Equibase Scraper | Horse Racing Entries and Results

Equibase Scraper | Horse Racing Entries and Results

Equibase scraper for horse racing entries and results: 50 runners in 10 seconds, 68 fields each. One row per horse with morning-line odds, jockey, trainer, owner, pedigree, career record, recent form, finish and payoffs. Type a track code or paste an Equibase URL. No account or API key needed.

Pricing

from $0.81 / 1,000 runners

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Equibase Scraper | Horse Racing Entries and Results (2026)

Equibase runners, 68 fields each, from any track.

From SilentFlow. Creators of Facebook Search Scraper and JD Products Scraper (#1 for “jd scraper” in Apify Store search), with 850,000+ combined lifetime runs.

Turn Equibase race cards into a spreadsheet: one row per horse in every race, with morning-line odds, jockey, trainer, owner, pedigree, career record and recent form, and once the race is run, the finish position and payoffs. 50 runners from 7 Gulfstream Park races in 13 seconds on our test run.

Why choose this actor?

Copying a race card into a sheet horse by horse before post time? Stuck with race-level records where the whole field sits in one text string your model cannot read? Need the sire, the dam and the last start of every horse in a 14-horse stakes field, and opening 14 profile pages to get them?

  • 67 data fields filled per runner, one horse per row. Each row carries the race (track, date, post time, type, conditions, purse, claiming price, distance in furlongs and yards, surface, age and sex restrictions, wagers, field size), the runner's line (program number, post position, morning line as text and as decimal odds, jockey, trainer, owner, registration number), its form before the race (days since last race, last finish, last race date, distance and purse, earnings per start, recent starts) and its profile (state or country where foaled, color, sex, foaling date, age, sire, dam, dam sire, breeder, career and current-year records, win and in-the-money percentages). On our default test run, 67 of the 76 fields were filled on at least half of the 50 rows; on a 30-runner results run, 70 were.
  • Pedigree and form come with the card, not as an extra. The default row already holds the horse's sire, dam, dam sire, breeder, career record, year-by-year record and its last starts with date, distance, finish and purse. A results run adds the official order of finish, win, place and show payoffs and every exotic payoff of the race on each row: 30 Santa Anita runners from 5 races came back in 11 seconds on our test run.
  • Paste the Equibase page you already have open. Next to track codes and track names, the actor reads Equibase URLs as they are: desktop entries pages, result charts, chart PDFs and mobile track or race pages, each with its own track and date. The Breeders' Cup entries URL with a stakes filter gave 30 runners from 2 Grade I races in 9 seconds; the 2025 Kentucky Derby day chart URL gave 25 runners from 3 races in 7 seconds.

Try Equibase Scraper

Try your first Runner

Paste this input in the JSON tab, or keep the prefilled form and press Start. It reads the next card at Gulfstream Park, then Santa Anita and Churchill Downs, until 50 runners are saved. On our test run the 50 runners came from the first 7 races at Gulfstream Park, in 13 seconds.

{
"tracks": ["GP", "SA", "CD"],
"cardType": "entries",
"maxItems": 50
}

Runs on the Apify Free plan: sign up, open the actor, press Start. Each horse in each race lands as one row of the dataset, which you can open as a table, download as CSV, Excel or JSON, or read from the API. Switch the card type to results for finish positions and payoffs, set a date to read a past race day, or paste an Equibase link in the second field.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the Equibase Scraper on Apify: silentflow/equibase-scraper
It returns one dataset row per horse in each race read from Equibase (equibase.com), the official source of
North American Thoroughbred racing data: upcoming entries, or official results.
No field is required. With neither tracks nor startUrls, every track with a card that day is read.
Input schema:
- tracks (array of string): Equibase track codes or names, e.g. "CD", "SA", "GP", "Keeneland", "Woodbine".
- startUrls (array of {url}): Equibase pages, e.g. "https://www.equibase.com/static/entry/CD110526USA-EQB.html",
"https://www.equibase.com/static/chart/summary/SA103026USA-EQB.html", mobile EntriesTrack/ResultsRace pages.
Add "#RACE5" to an entries URL to read one race.
- cardType (string, "entries" or "results", default "entries").
- date (string, YYYY-MM-DD, "today", "tomorrow" or "yesterday"; empty = next card for entries, latest card for results).
- maxItems (integer, default 50): total rows to save.
- raceTypes (array of string): keep races whose type or name contains a word, e.g. "stakes", "graded", "maiden", "claiming".
- surfaces (array of "dirt" | "turf" | "synthetic").
- excludeScratched (boolean, default false).
- includeHorseDetails (boolean, default true): pedigree, breeder, color, sex, age, career and yearly records.
Output per row (76 fields):
- id, url, horseName, horseId, raceId, cardType ("entries" or "results")
- trackCode, trackName, country, raceDate (YYYY-MM-DD), raceNumber, postTime, raceName, grade, raceType,
raceConditions, purse (number), claimingPrice, distance, distanceFurlongs, distanceYards, surface,
ageRestriction, sexRestriction, isStakes, isClaiming, isMaiden, wagers (array), fieldSize
- programNumber, postPosition, morningLineOdds ("5/2"), morningLineDecimal (3.5), isScratched, jockey, trainer,
owner, registrationNumber
- finishPosition, winPayoff, placePayoff, showPayoff, exoticPayoffs (array of {wagerType, baseAmount, payoff,
winningNumbers}); results only
- earningsPerStart, daysSinceLastRace, lastRaceFinish, lastRaceDate, lastRaceDistance, lastRacePurse,
pastStarts (array of {date, distance, distanceFurlongs, finish, purse}); form before the race
- horseState, color, sex, foalingDate, age, sire, dam, damSire, breeder, careerStarts, careerWins, careerPlaces,
careerShows, careerEarnings, winPercentage, inTheMoneyPercentage, currentYearStarts, currentYearWins,
currentYearPlaces, currentYearShows, currentYearEarnings, yearlyStats (array)
- horseUrl, entryUrl, chartUrl, scrapedAt (RFC 3339)
Missing values are null. Money is in US dollars as numbers.
Use apify-client for Python or JS: client.actor("silentflow/equibase-scraper").call(run_input={...}).

How to scrape Equibase race entries and results

Get tomorrow's entries at Churchill Downs

The simplest run: one track, one day. Every horse entered comes back with its morning line, connections, pedigree and form.

{
"tracks": ["CD"],
"date": "tomorrow",
"maxItems": 150
}

Pull the latest Santa Anita results with payoffs

Switch the card type to results. Each finisher gets its official finish position, its win, place and show payoffs, and the race's exotic payoffs (exacta, trifecta, superfecta, pick 3 and more).

{
"tracks": ["Santa Anita"],
"cardType": "results",
"maxItems": 150
}

Paste the entries page you are looking at and add the race anchor. The run reads that race only: post positions, morning lines, connections, pedigree and the last starts of every horse in the field.

{
"startUrls": [
{ "url": "https://www.equibase.com/static/entry/KEE103126USA-EQB.html#RACE12" }
],
"maxItems": 20
}

Input parameters

FieldTypeDefaultWhat it does
tracksarray of stringsprefilled with GP, SA, CDEquibase track codes or names. Leave empty, with no URL, to read every track racing that day.
startUrlsarray of URLsemptyEquibase entries, chart or mobile pages, read with their own track and date.
cardTypeentries or resultsentriesUpcoming races with morning lines, or official results with payoffs.
datestringemptyYYYY-MM-DD, today, tomorrow or yesterday. Empty reads the next card (entries) or the latest card (results).
maxItemsinteger50Total rows to save, one per horse in a race. No fixed upper limit.
raceTypesarray of stringsemptyKeep races whose type or name contains one of the words: stakes, graded, maiden, claiming, allowance, Breeders' Cup.
surfacesarrayemptyKeep races on dirt, turf or synthetic.
excludeScratchedbooleanfalseDrop scratched horses. When off, they stay with isScratched: true.
includeHorseDetailsbooleantrueAdds pedigree, breeder, color, sex, foaling date, age, career and yearly records.
debugModebooleanfalseWrites a detailed log for troubleshooting.

Accepted formats

  • Track codes: the short codes Equibase uses in its links, for example CD (Churchill Downs), SA (Santa Anita), GP (Gulfstream Park), KEE (Keeneland), BEL (Belmont Park), AQU (Aqueduct), DMR (Del Mar), WO (Woodbine), LRL (Laurel Park), PRX (Parx Racing). Case does not matter.
  • Track names: the name as Equibase prints it (Gulfstream Park) or a clear part of it (Santa Anita, woodbine). Names are matched against the tracks racing that week; for a track that is not racing now, use its code with a date.
  • Desktop entries pages: https://www.equibase.com/static/entry/CD110526USA-EQB.html, the whole card, or with #RACE5 for one race.
  • Result charts: https://www.equibase.com/static/chart/summary/SA103026USA-EQB.html for a whole day, https://www.equibase.com/static/chart/pdf/CD102926USA3.pdf for one race.
  • Mobile pages: https://mobile.equibase.com/View.cfm/EntriesTrack?t=GP&c=USA, .../ResultsTrack?..., .../EntriesRace?..., .../ResultsRace?....
  • Track profiles: https://www.equibase.com/profiles/Results.cfm?type=Track&trk=SA&cy=USA.
  • Dates: 2026-11-05, 11/05/2026, today, tomorrow, yesterday (US Eastern race day).

What data can you extract from Equibase?

Every row is one horse in one race, with 76 fields in six groups. Missing values are null, numbers are numbers, dates are YYYY-MM-DD.

GroupFields
Identityid (track, date, race and horse), url, horseName, horseId (Equibase reference number), raceId, cardType
RacetrackCode, trackName, country, raceDate, raceNumber, postTime, raceName, grade, raceType, raceConditions, purse, claimingPrice, distance, distanceFurlongs, distanceYards, surface, ageRestriction, sexRestriction, isStakes, isClaiming, isMaiden, wagers, fieldSize
RunnerprogramNumber, postPosition, morningLineOdds, morningLineDecimal, isScratched, jockey, trainer, owner, registrationNumber
ResultfinishPosition, winPayoff, placePayoff, showPayoff, exoticPayoffs (wager type, base amount, payoff, winning numbers)
Form before the raceearningsPerStart, daysSinceLastRace, lastRaceFinish, lastRaceDate, lastRaceDistance, lastRacePurse, pastStarts (date, distance, distance in furlongs, finish, purse of each recent start)
Horse profilehorseState, color, sex, foalingDate, age, sire, dam, damSire, breeder, careerStarts, careerWins, careerPlaces, careerShows, careerEarnings, winPercentage, inTheMoneyPercentage, currentYearStarts, currentYearWins, currentYearPlaces, currentYearShows, currentYearEarnings, yearlyStats
Links and timehorseUrl, entryUrl, chartUrl, scrapedAt

Useful facts for working with the data:

  • id and raceId are stable: the same horse in the same race always gets the same id, so a scheduled run can update rows instead of duplicating them.
  • horseId is the Equibase reference number of the horse and never changes over its career; horseUrl is its permanent Equibase profile.
  • entryUrl (entries) and chartUrl (results) point to the Equibase desktop page of the race day; url is the race page the row was read from, pointed at that horse, so each row has its own.
  • The form block (daysSinceLastRace, lastRace*, pastStarts, earningsPerStart) is as of race day, so it carries no hindsight for a backtest. The career and current-year records are as of the run.
  • morningLineDecimal turns the morning line into decimal odds: 5/2 becomes 3.5, EVEN becomes 2.
  • winPayoff, placePayoff and showPayoff are the payoffs on a two-dollar ticket, as Equibase publishes them; only the first three finishers have them.

Output example

One complete row from our default test run (Gulfstream Park, race 1, entries):

{
"id": "GP-2026-10-31-R1-11458872",
"url": "https://mobile.equibase.com/View.cfm/EntriesRace?t=GP&c=USA&n=1&d=2026-10-31&s=D#horse-11458872",
"horseName": "New Friend",
"horseId": "11458872",
"raceId": "GP-2026-10-31-R1",
"cardType": "entries",
"trackCode": "GP",
"trackName": "Gulfstream Park",
"country": "USA",
"raceDate": "2026-10-31",
"raceNumber": 1,
"postTime": "12:00 PM",
"raceName": null,
"grade": null,
"raceType": "Maiden Claiming",
"raceConditions": "For Maidens, Two Years Old. One Mile. (Turf) (Rail at 66 Feet)",
"purse": 30000,
"claimingPrice": 25000,
"distance": "1 Mile",
"distanceFurlongs": 8,
"distanceYards": 1760,
"surface": "Turf",
"ageRestriction": "2",
"sexRestriction": "Open",
"isStakes": false,
"isClaiming": true,
"isMaiden": true,
"wagers": ["$1 Daily Double", "$1 Exacta", "$.50 Trifecta", "$.10 Superfecta", "$1.00 Bet 3 (Races 1-2-3)", "$.50 Pick 5 (Races 1-2-3-4-5)"],
"fieldSize": 6,
"programNumber": "1",
"postPosition": 1,
"morningLineOdds": "6/1",
"morningLineDecimal": 7,
"isScratched": false,
"jockey": "Yolber Torres",
"trainer": "Jose Francisco D'Angelo",
"owner": "Sabby Racing LLC",
"registrationNumber": "24001547",
"finishPosition": null,
"winPayoff": null,
"placePayoff": null,
"showPayoff": null,
"exoticPayoffs": null,
"earningsPerStart": 2720,
"daysSinceLastRace": 20,
"lastRaceFinish": 4,
"lastRaceDate": "2026-10-11",
"lastRaceDistance": "1 Mile 70 Yards",
"lastRacePurse": 31000,
"pastStarts": [
{ "date": "2026-10-11", "distance": "1 Mile 70 Yards", "distanceFurlongs": 8.32, "finish": 4, "purse": 31000 },
{ "date": "2026-09-19", "distance": "5 Furlongs", "distanceFurlongs": 5, "finish": 3, "purse": 60000 },
{ "date": "2026-08-15", "distance": "5 Furlongs", "distanceFurlongs": 5, "finish": 4, "purse": 70000 }
],
"horseState": "KY",
"color": "Bay",
"sex": "Gelding",
"foalingDate": "2024-02-08",
"age": 2,
"sire": "Charlatan",
"dam": "Old Pho",
"damSire": "American Pharoah",
"breeder": "Stoneriggs Farm",
"careerStarts": 4,
"careerWins": 0,
"careerPlaces": 0,
"careerShows": 1,
"careerEarnings": 8405,
"winPercentage": 0,
"inTheMoneyPercentage": 25,
"currentYearStarts": 4,
"currentYearWins": 0,
"currentYearPlaces": 0,
"currentYearShows": 1,
"currentYearEarnings": 8405,
"yearlyStats": [
{ "year": 2026, "starts": 4, "wins": 0, "places": 0, "shows": 1, "earnings": 8405 }
],
"horseUrl": "https://www.equibase.com/profiles/Results.cfm?type=Horse&refno=11458872&registry=T&rbt=TB",
"entryUrl": "https://www.equibase.com/static/entry/GP103126USA-EQB.html",
"chartUrl": null,
"scrapedAt": "2026-10-31T18:22:38Z"
}

A results row carries the same fields, with the result block filled. From our Santa Anita results test run (race 1, 30 October 2026), the winner's row reads:

{
"horseName": "Awesome Olga",
"cardType": "results",
"programNumber": "5",
"postPosition": 5,
"morningLineOdds": "12/1",
"finishPosition": 1,
"winPayoff": 14,
"placePayoff": 5.6,
"showPayoff": 4.4,
"exoticPayoffs": [
{ "wagerType": "Exacta", "baseAmount": 1, "payoff": 130.5, "winningNumbers": "5-2" },
{ "wagerType": "Superfecta", "baseAmount": 0.1, "payoff": 211.15, "winningNumbers": "5-2-6-3" }
],
"chartUrl": "https://www.equibase.com/static/chart/summary/SA103026USA-EQB.html"
}

Advanced usage

Pull only the graded stakes of a big race day

Paste the day's entries page and keep the graded races. On Breeders' Cup day this returns every Grade I field with morning lines, pedigree and form, ready for a preview or a betting sheet.

{
"startUrls": [
{ "url": "https://www.equibase.com/static/entry/KEE103126USA-EQB.html" }
],
"raceTypes": ["graded"],
"maxItems": 200
}

Rebuild Kentucky Derby day results from a past season

Results stay readable for past race days: set the track, the date and the results card type. Use it to build a history of a meet or of a stakes race across years.

{
"tracks": ["CD"],
"cardType": "results",
"date": "2025-05-03",
"maxItems": 250
}

Export a whole day of North American racing, fast

Leave the tracks empty to read every track with a card that day, and turn the horse profile off to read one page less per horse. Raise the cap to cover the full slate: a busy day runs to several hundred runners.

{
"cardType": "results",
"date": "yesterday",
"includeHorseDetails": false,
"maxItems": 2000
}

Study first-time starters in maiden turf races

Combine the filters: maiden races, turf only, scratched horses dropped. Rows with an empty pastStarts and no lastRaceDate are the debut runners; sort them by sire to compare sires on debut.

{
"tracks": ["GP", "SA", "KEE", "BEL"],
"raceTypes": ["maiden"],
"surfaces": ["turf"],
"excludeScratched": true,
"maxItems": 300
}

Feed a daily handicapping sheet every morning

Save this input as a task and schedule it at 8 a.m. Eastern: each morning the dataset holds the day's card at your track, and the Google Sheets, Make or Zapier integrations push it to your sheet. The stable id lets you update yesterday's rows with the results run of the evening.

{
"tracks": ["GP"],
"date": "today",
"maxItems": 150
}

FAQ

What is Equibase? Equibase is the official database of Thoroughbred racing in North America, run by The Jockey Club and the racetracks. It publishes the entries, results, charts and horse profiles of every race at US, Canadian and Puerto Rican tracks.

What does this actor extract? One row per horse in each race: the race conditions and purse, the runner's post position, morning line and connections, its form before the race, its pedigree and records, and for results its finish position and payoffs. 76 fields per row, listed above.

Do I need an Equibase account or an API key? No. The actor reads the public entries, results and horse profiles that anyone can open on Equibase. No login, no subscription, no key.

How fresh is the data, and when are entries published? Every run reads Equibase live. Entries usually appear 2 to 3 days before race day; morning lines can be added a little later, so a card read early may show morningLineOdds: null for some horses. Results appear once the race is official. Scratches are reflected as soon as Equibase lists them.

How far back can I get results? Results race pages stay readable for past seasons: our test read Kentucky Derby day 2025. For races older than a few days, the form-before-the-race block and the surface are not always published, so those fields may be null; the result, the runner and the horse profile are still there.

Can I read several tracks or several days in one run? Several tracks, yes: list their codes, or leave the list empty to read every track racing that day. One date applies to the whole run, but each URL carries its own date, so pasting chart URLs of different days reads them all. For a daily feed, schedule a task with date set to today.

Do the filters combine? Yes. raceTypes, surfaces and excludeScratched apply together: maiden, turf and scratches dropped returns only the active runners of maiden turf races.

Does it include speed figures, fractions or workouts? No. Speed figures, pace figures, fractional times and workouts are paid Equibase products. The actor returns what Equibase shows for free: recent starts with date, distance, finish and purse, earnings per start, days since last race, and the career and yearly records.

Are the career records as of race day? The form block (daysSinceLastRace, lastRaceFinish, lastRaceDate, pastStarts, earningsPerStart) is as of race day. careerStarts to careerEarnings and the currentYear fields are the horse's record on the day you run the actor: for a race run today, they may already include today's start.

Which links are permanent? horseUrl (the Equibase profile) and horseId never change. entryUrl and chartUrl are the desktop pages of the race day. url is the race page the row was read from, pointed at that horse, and stays valid as long as Equibase keeps it online.

Is scraping Equibase legal? The actor reads publicly available racing data, without login or paywall. You are responsible for how you use it: see the legal section below and Equibase's terms of use.

More SilentFlow scrapers

🛒 E-commerce

💼 Jobs

🏠 Real estate

📣 Social media

🏢 Business data

✈️ Travel

🎯 Lead generation

🔎 SEO

📈 Marketing

🎬 Video

📰 News

🧰 More tools

Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This Actor extracts publicly available racing data from Equibase (equibase.com): race entries, results, payoffs and horse profiles. It does not bypass any login, paywall or CAPTCHA, and it does not read Equibase's paid products. Users are responsible for complying with Equibase's terms of use and with applicable data protection laws (GDPR in the European Union, CCPA in California, and PIPL in China where relevant). Jockey, trainer, owner and breeder names can be personal data: keep only what your purpose needs and handle them accordingly. The data is informational: confirm entries, scratches and payoffs with the official sources before a wager or any regulated use.

Equibase Scraper by SilentFlow: every horse of every race card, entries or results, with odds, connections, pedigree and form on one row.