Racing Post APIracingpost.com ↗
Access Racing Post data via API: daily racecards, race results by date, horse form history, stats, pedigree, and meeting schedules across 5 endpoints.
What is the Racing Post API?
The Racing Post API exposes 5 endpoints covering daily race meetings, historical results, and detailed horse profiles sourced from Racing Post. get_todays_racecards returns every scheduled meeting for the current date, including going, weather, and race-level details, while get_horse_profile delivers form history, flat and jumps stats, and pedigree data keyed by a horse's numeric ID and URL slug.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/8d53554b-4c94-45db-bf28-df52c83ad1d0/get_todays_racecards' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace racingpost-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.racing_post_api import RacingPost, HorseProfileTab
client = RacingPost()
# Get today's racecards and inspect meetings
for meeting in client.racecards.today():
print(meeting.venue_name, meeting.meeting_type, meeting.going)
for race in meeting.races:
print(race.race_id, race.race_title, race.number_of_runners)
break
# Get race detail for a specific race via constructible RaceSummary
race = client.racesummary(race_id="920143")
detail = race.detail()
print(detail.verdict.name, detail.verdict.author_name)
for runner in detail.predictor.runners:
print(runner.horse_name, runner.score)
# Get horse profile with form history
profile = client.racecards.horse_profile(
horse_id="7847680", horse_slug="quadrillion", tab=HorseProfileTab.FORM
)
for entry in profile.form:
print(entry.course_name, entry.race_datetime, entry.odds_desc, entry.rp_postmark)
# Get yesterday's results with betting returns
for result in client.racecards.results(date="2026-06-09"):
print(result.venue_name, result.title)
if result.betting_returns:
print(result.betting_returns.tote_win, result.betting_returns.straight_forecast)
Retrieve today's racecards and meeting schedules. Returns all meetings scheduled for the current UTC date, including race details, going, weather, and betting returns for completed races. Each meeting contains a races array with individual race metadata (raceId, raceTitle, startScheduledDatetime, numberOfRunners, going, distance, bettingReturns). Pagination is not applicable; the entire day's schedule is returned in a single response.
No input parameters required.
{
"type": "object",
"fields": {
"meetings": "array of meeting objects, each containing venueName, venueUid, courseKey, races array, going, weather, meetingType, numberOfRaces, and other meeting metadata"
},
"sample": {
"data": {
"meetings": [
{
"going": "TURF: GOOD",
"races": [
{
"raceId": "922633",
"distance": {
"yards": 1980
},
"raceType": "Flat",
"raceTitle": "Chek Lap Kok Handicap (Class 5)",
"bettingReturns": null,
"numberOfRunners": 12,
"currentRaceStatus": "declared",
"startScheduledDatetime": {
"utc": "2026-06-10T11:40:00+01:00",
"local": "2026-06-10T18:40:00+08:00"
}
}
],
"weather": null,
"venueUid": 396,
"courseKey": "happy-valley",
"meetingId": null,
"venueName": "Happy Valley",
"meetingType": "flat",
"numberOfRaces": 9,
"rpMeetingOrder": 6,
"venueCountryCode": "HK"
}
]
},
"status": "success"
}
}About the Racing Post API
Race Meetings and Schedules
get_todays_racecards and get_racecards_by_date both return an array of meeting objects. Each meeting includes venueName, venueUid, courseKey, going, weather, and meetingType, along with a nested races array. get_racecards_by_date accepts a single date parameter in YYYY-MM-DD format, making it straightforward to pull historical card data or plan ahead. For completed races, both endpoints include betting return fields alongside the race details.
Race Results
get_race_results_by_date filters to only races where currentRaceStatus is 'result', so the response will always be empty for future dates or dates with no settled races. Each result object contains race_id, venue_id, venue_name, course_key, time, title, and betting_returns fields such as toteWin and place values. The race_id values from this endpoint can be passed directly to get_race_detail for deeper race-level content.
Horse Profiles
get_horse_profile requires a horse_id (numeric, sourced from racecard data) and a horse_slug (lowercase, hyphen-separated name). The optional tab parameter controls what the response contains: 'form' returns a form array of past race entries plus a raceRecords summary object; 'stats' returns a stats object with separate statsFlat and statsJumps arrays; 'pedigree' returns lineage data. Omitting the tab parameter defaults to form data.
Race Detail Fragment
get_race_detail accepts a race_id and returns an html string containing accordion sections with verdict, form guide, and other racecard content for that specific race. This is an HTML fragment rather than structured JSON, so consumers need to parse or render the markup directly.
The Racing Post API is a managed, monitored endpoint for racingpost.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when racingpost.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official racingpost.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a daily racing digest app using
get_todays_racecardsto list all meetings, going conditions, and weather. - Backfill a historical results database using
get_race_results_by_datewithbetting_returnsfields for settling bets. - Compare a horse's flat vs. jumps career statistics using the
statsFlatandstatsJumpsarrays fromget_horse_profilewithtab=stats. - Construct pedigree trees for bloodstock analysis using the pedigree tab in
get_horse_profile. - Display pre-race form guides by fetching the HTML accordion from
get_race_detailfor a specificrace_id. - Monitor course-specific trends by filtering meeting objects by
courseKeyacross multiple dates. - Automate ante-post research by pulling
raceRecordssummaries for horses listed in upcoming racecards.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Racing Post have an official developer API?+
How does `get_horse_profile` differ by tab, and which tab should I use for career win rates?+
tab parameter changes the response structure entirely. tab=form returns a chronological form array of past race entries and a raceRecords summary. tab=stats returns a stats object with statsFlat and statsJumps arrays, which is where per-discipline win/place breakdowns live. tab=pedigree returns lineage data. For career win rates, use tab=stats.Does `get_race_results_by_date` include non-UK and non-Irish races?+
Is there an endpoint for trainer or jockey profiles?+
What is the format of the data returned by `get_race_detail`, and can I filter specific sections?+
html string containing the full accordion fragment for the race, including verdict and form guide sections. The response is not structured JSON, so there is no built-in filtering by section. Consumers need to parse the HTML markup client-side to isolate specific accordion sections.