At The Races APIattheraces.com ↗
Access At The Races racecards, draw bias stats, pace analysis, FormScan collateral form, and expert tips via 5 structured endpoints.
What is the At The Races API?
This API exposes 5 endpoints covering At The Races racecard intelligence, including full runner details, draw bias statistics, pace analysis, FormScan collateral form data, and daily expert tips. The get_racecard endpoint alone returns over a dozen fields per runner — draw, form string, official rating, star rating, jockey, trainer, age/weight, betting forecast, and expert commentary — for any UK or Irish race identified by course, date, and time.
curl -X GET 'https://api.parse.bot/scraper/8d6569fa-c1a6-4496-b31e-5a7c6abc854b/get_racecard?date=7-August-2026&time=1440&course=Nottingham' \ -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 SDK — fetch tips, racecards, and race analysis."""
from parse_apis.At_The_Races_Racecard_API import AtTheRaces, RaceNotFound
client = AtTheRaces()
# Get today's expert tips for a course
tips = client.tip_collections.get(course="Nottingham")
print(f"Tips for {tips.course} on {tips.date}:")
for tip in tips.tips[:3]:
print(f" {tip.race_time} {tip.race_name}: {tip.top_tip_horse} (rating {tip.top_tip_rating})")
# Fetch the full racecard for a specific race
racecard = client.racecards.get(course="Nottingham", date="3-August-2026", time="1440")
print(f"\nRace: {racecard.race_name} — {racecard.going}, {racecard.distance}")
for runner in racecard.runners[:3]:
print(f" #{runner.number} {runner.horse_name} (Draw {runner.draw}) - Jockey: {runner.jockey}")
# Get draw bias analysis
draw = client.draw_analyses.get(course="Nottingham", date="3-August-2026", time="1440")
for entry in draw.draw_data[:3]:
print(f" Draw {entry.draw} ({entry.horse_name}): bias {entry.draw_bias_result}")
# 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"\nRace not found: {e}")
print("\nExercised: tip_collections.get / racecards.get / draw_analyses.get / RaceNotFound")
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 D-Month-YYYY format (e.g. 3-August-2026). |
| timerequired | string | Race time in HHMM format without colon (e.g. 1440 for 2:40 PM). |
| courserequired | string | Course name as it appears in the URL path, hyphenated for multi-word names (e.g. Ffos-Las, Newton-Abbot, Nottingham). |
{
"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/Nottingham/3-August-2026/1440",
"date": "3-August-2026",
"time": "1440",
"going": "Good to Firm (Good in places)",
"prize": "Winner £5,400",
"course": "Nottingham",
"race_id": "1603165",
"runners": [
{
"draw": "6",
"form": "3-3",
"jockey": "S M Levey",
"number": "1",
"rating": "101",
"trainer": "R Hannon",
"horse_id": "3807019",
"age_weight": "3 9-2",
"horse_name": "Aura Champagne (IRE)",
"expert_view": "Improved for debut experience...",
"star_rating": "4",
"official_rating": "-"
}
],
"distance": "1m 75y",
"forecast": "Forecast: 9/4 Yimmna...",
"race_name": "Nottingham - 03/08/26 - 14:40 - Class 4 horse race, 1m 0f 75y",
"race_class": "GBB Race | Class 4 | 3YO plus",
"venue_name": "Nottingham Racecourse",
"description": "At The Races Presents - Nottingham",
"draw_advantage": "High",
"number_of_runners": 5
},
"status": "success"
}
}About the At The Races API
Racecard and Runner Data
The get_racecard endpoint takes three required inputs — course (hyphenated, e.g. Ffos-Las), date (e.g. 23-June-2026), and time (HHMM, e.g. 1430) — and returns a full runner list with fields including horse_name, horse_id, draw, form, age_weight, official_rating, star_rating, jockey, trainer, forecast, and expert_view commentary. Race-level fields include going, prize, distance, and a race_id you can reuse across the other endpoints.
Draw Bias and Pace Analysis
get_draw_data returns per-draw-position statistics (expected_wins, actual_wins, draw_bias_result) for each runner in the race, useful for flat racing where stall position materially affects outcome. get_pace_data returns a pace_rating, pace_position_pct, and pace_description for each runner, indicating whether a horse is likely to race prominently or from behind — data that helps model front-runner vs. hold-up scenarios.
FormScan and Expert Tips
get_formscan returns ATR's collateral form data: a ranked list of runners with an index_rating and an array of comparisons — text strings describing where two horses have met before and what the form line implies. This is distinct from raw form figures; it links horses that have run against common rivals. get_tips operates differently from the other four endpoints: it takes only course as input and returns one tip object per race for that day, including top_tip_horse, watch_out_horse, top_tip_rating, watch_out_rating, and a commentary string from ATR's daily expert guide.
The At The Races API is a managed, monitored endpoint for attheraces.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when 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 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?+
- Build a draw bias filter that flags races where
draw_bias_resultstrongly favours low or high stalls. - Aggregate
pace_descriptionfields across a field to identify races likely to have an early pace collapse. - Compare
official_ratingagainststar_ratingto surface runners ATR experts rate above their handicap mark. - Pull
get_formscanindex_ratingdata to rank runners by collateral form strength without manual cross-referencing. - Automate a daily tips digest by calling
get_tipsfor each day's active courses and collatingtop_tip_horseselections. - Cross-reference
forecastodds withofficial_ratingto find runners trading shorter or longer than their rating suggests. - Feed
pace_position_pctvalues into a race modeller to predict likely race shape and pace scenarios.
| 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 At The Races have an official developer API?+
What does `get_formscan` return and how is it different from the form string in `get_racecard`?+
form field in get_racecard is the standard recent-results string (e.g. '1-2-3'). get_formscan returns ATR's FormScan analysis: each entry has a rank, an index_rating, and a comparisons array of text strings that describe specific head-to-head or collateral form links between runners in the same race. It is a derived analytical layer, not raw form figures.Does `get_tips` return tips for all UK and Irish courses in a single call?+
get_tips takes a single course parameter and returns tips only for races at that course on the current day. To cover a full day's racing across multiple venues you would need one call per course. You can fork this API on Parse and revise it to add a multi-course batch tips endpoint.Are historical racecards available, or is the data limited to upcoming races?+
Does `get_draw_data` return draw statistics for all race types, including jumps races?+
get_draw_data will return the data structure ATR publishes for the requested race, but for National Hunt fixtures the draw bias fields will not carry meaningful values. The endpoint itself does not filter by race type, so callers should apply that logic on their side.