attheraces.com APIwww.attheraces.com ↗
Access At The Races racecard data, draw bias statistics, pace analysis, and FormScan collateral form via 4 structured API endpoints.
curl -X GET 'https://api.parse.bot/scraper/8d6569fa-c1a6-4496-b31e-5a7c6abc854b/get_racecard?date=23-June-2026&time=1430&course=Ffos-Las' \ -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 attheraces-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.
"""Walkthrough: At The Races racecard SDK — fetch race data and analysis."""
from parse_apis.At_The_Races_Racecard_API import AtTheRaces, RaceNotFound
client = AtTheRaces()
# Fetch the full racecard for a specific race
racecard = client.racecards.get(course="Ffos-Las", date="23-June-2026", time="1430")
print(f"Race: {racecard.race_name} at {racecard.venue_name}")
print(f"Going: {racecard.going}, Distance: {racecard.distance}, Runners: {racecard.number_of_runners}")
# Inspect individual runners with expert views
for runner in racecard.runners[:3]:
print(f" #{runner.number} {runner.horse_name} (Draw {runner.draw}) - Jockey: {runner.jockey}")
print(f" Rating: {runner.rating}, Stars: {runner.star_rating}, Form: {runner.form}")
if runner.expert_view:
print(f" Expert: {runner.expert_view[:80]}...")
# Get draw bias analysis for the same race
draw = client.draw_analyses.get(course="Ffos-Las", date="23-June-2026", time="1430")
for entry in draw.draw_data[:3]:
print(f" Draw {entry.draw} ({entry.horse_name}): bias {entry.draw_bias_result}")
# Get pace analysis
pace = client.pace_analyses.get(course="Ffos-Las", date="23-June-2026", time="1430")
for entry in pace.pace_data[:3]:
print(f" Horse {entry.horse_id}: pace {entry.pace_rating}, position {entry.pace_position_pct}")
# Handle a non-existent race gracefully
try:
missing = client.racecards.get(course="NonExistent", date="01-January-2020", time="0000")
except RaceNotFound as e:
print(f"Race not found: {e}")
print("Exercised: racecards.get / draw_analyses.get / pace_analyses.get / RaceNotFound error handling")
Retrieve the full racecard for a specific race including runner details, form, jockey/trainer, age/weight, official rating, expert view commentary, star ratings, and betting forecast.
| Param | Type | Description |
|---|---|---|
| daterequired | string | Race date in DD-Month-YYYY format (e.g. 23-June-2026). |
| timerequired | string | Race time in HHMM format without colon (e.g. 1430 for 2:30 PM). |
| courserequired | string | Course name as it appears in the URL path, hyphenated for multi-word names (e.g. Ffos-Las, Newton-Abbot, Newbury). |
{
"type": "object",
"fields": {
"url": "string",
"date": "string",
"time": "string",
"going": "string",
"prize": "string",
"course": "string",
"race_id": "string",
"runners": "array of runner objects with draw, number, rating, star_rating, form, horse_name, horse_id, age_weight, official_rating, jockey, trainer, expert_view, headgear, silk_url, silk_description",
"distance": "string",
"forecast": "string",
"race_name": "string",
"race_class": "string",
"venue_name": "string",
"description": "string",
"draw_advantage": "string",
"number_of_runners": "integer"
},
"sample": {
"data": {
"url": "https://www.attheraces.com/racecard/Ffos-Las/23-June-2026/1430",
"date": "23-June-2026",
"time": "1430",
"going": "Good",
"prize": "Winner £4,187",
"course": "Ffos-Las",
"race_id": "1590891",
"runners": [
{
"draw": "7",
"form": "22218-1",
"jockey": "Billy Loughnane",
"number": "1",
"rating": "79",
"trainer": "C Mason",
"headgear": "v",
"horse_id": "3227627",
"age_weight": "8 10-1 v",
"horse_name": "On Edge",
"expert_view": "Ran to best, hit the line well landing a handicap by a neck off a 2lb lower mark at Chepstow last time; trainer in form; effective 5/6f, acts on any; in very good form, respected after small rise.",
"star_rating": "4",
"official_rating": "75"
}
],
"distance": "6f",
"forecast": "Forecast: 11/4 Lohoobb , 7/2 On Edge , 4/1 Punchbowl Flyer",
"race_name": "Ffos Las - 23/06/26 - 14:30 - Class 5 horse race, 0m 6f 0y",
"race_class": "Class 5 | 3YO plus",
"venue_name": "Ffos Las Racecourse",
"draw_advantage": "None",
"number_of_runners": 7
},
"status": "success"
}
}About the attheraces.com API
The At The Races API exposes 4 endpoints covering horse racing racecard data, draw bias statistics, pace analysis, and FormScan collateral form from attheraces.com. The get_racecard endpoint returns full runner fields including form string, official rating, star rating, jockey, trainer, age/weight, expert view commentary, and betting forecast for any race identified by course, date, and time.
Racecard and Runner Data
The get_racecard endpoint accepts three required parameters — course (hyphenated, e.g. Ffos-Las), date (e.g. 23-June-2026), and time (e.g. 1430) — and returns a race-level object containing going, prize, distance, forecast, and a runners array. Each runner object includes draw, number, horse_name, horse_id, form, age_weight, official_rating, star_rating, jockey, trainer, and expert view commentary. This makes it straightforward to reconstruct a full racecard programmatically.
Draw Bias and Pace Analysis
The get_draw_data endpoint returns an array of draw entries, each with draw, expected_wins, actual_wins, and a draw_bias_result field that summarises whether a stall position is statistically favourable or unfavourable at the course. The get_pace_data endpoint returns pace_rating, pace_position_pct, and pace_description per runner, giving a numeric and textual view of where each horse typically races — useful for identifying front-runner-heavy or hold-up fields.
FormScan Collateral Form
The get_formscan endpoint returns ranked entries from the At The Races FormScan tool. Each entry carries an index_rating, a rank, and a comparisons array of text strings describing previous head-to-head form links between runners in the field. This collateral form data lets you reason about relative ability based on shared race history rather than isolated performance figures alone.
Inputs and Identifiers
All four endpoints share the same three-parameter signature: course, date, and time. The race_id field returned in every response can be used to cross-reference results across endpoints for the same race. Course names must match the URL path format used on attheraces.com, with spaces replaced by hyphens (e.g. Newton-Abbot, Newbury).
The attheraces.com API is a managed, monitored endpoint for www.attheraces.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when www.attheraces.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 www.attheraces.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?+
- Building a draw bias alert tool that flags statistically favourable stall positions using
actual_winsvsexpected_wins. - Aggregating official ratings and star ratings from
get_racecardto power a race comparison dashboard. - Feeding
pace_descriptionandpace_position_pctdata into a pace-scenario modeller for flat race analysis. - Extracting FormScan
index_ratingandcomparisonsdata to surface form links between runners meeting for the first time. - Archiving historical racecard data including
going,prize,distance, andforecastfor model training. - Populating a betting research tool with expert view commentary and
star_ratingfields for each runner. - Cross-referencing draw bias data with pace positions to identify horses likely to be disadvantaged by both factors.
| 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 | 250 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 At The Races have an official public developer API?+
What does `get_formscan` return and how is it different from the racecard form string?+
get_formscan endpoint returns collateral form data — each entry includes an index_rating, a rank, and a comparisons array of text strings showing direct or indirect form links between runners. This is distinct from the raw form string in get_racecard, which is a horse's sequential result sequence rather than a cross-runner comparison.Does the API cover historical races or only upcoming racecards?+
course, date, and time. Coverage depends on what attheraces.com makes available for the requested date; very old historical dates may not return data. The API does not expose a browse or search endpoint to enumerate available races. You can fork it on Parse and revise to add a race-listing endpoint if needed.Is results data (finishing positions, winning times) available through this API?+
What is the `draw_bias_result` field and how should it be interpreted?+
draw_bias_result field in get_draw_data is a categorical summary produced from the comparison of actual_wins to expected_wins for a given stall position at the course. A stall that has won significantly more often than expected will carry a positive bias result; one that underperforms its expected share will carry a negative result. It reflects historical draw patterns at the specific course, not a prediction for any individual race.