Sporting Life APIsportinglife.com ↗
Fetch UK and Irish horse racing racecards from Sporting Life. Get meeting details, race times, runners, trainers, jockeys, odds, and official ratings by date.
What is the Sporting Life API?
The Sporting Life Racecards API provides structured horse racing data from sportinglife.com through a single endpoint, get_racecards, that returns every UK and Irish race for a given date. Each response includes up to a dozen fields per race — venue, going, surface, distance, class, age restrictions, and a full runner list with horse name, trainer, jockey, odds, weight, draw, and official rating. The endpoint accepts one required date parameter in ISO format.
curl -X GET 'https://api.parse.bot/scraper/487a7789-ea4c-4780-8bbe-cc1d0cc64270/get_racecards?date=2026-08-19' \ -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 sportinglife-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: Sporting Life Racing SDK — fetch tomorrow's racecards."""
from parse_apis.sportinglife_com_api import SportingLife, InputFormatInvalid
client = SportingLife()
# Fetch racecards for a specific date, capped at 5 races.
try:
first_race = client.racecards.list(date="2026-08-19", limit=1).first()
except InputFormatInvalid as e:
print(f"Bad date format: {e.message}")
raise
if first_race is not None:
print(f"{first_race.meeting} — {first_race.race_name} ({first_race.time})")
print(f" Going: {first_race.going}, Surface: {first_race.surface}, Distance: {first_race.distance}")
print(f" Runners: {first_race.runners_count}")
# Inspect the horses in this race.
for horse in first_race.horses[:3]:
rating = horse.official_rating if horse.official_rating is not None else "n/a"
print(f" {horse.cloth_number}. {horse.name} — Jockey: {horse.jockey}, Odds: {horse.odds}, OR: {rating}")
# Iterate several races to find a specific meeting.
for race in client.racecards.list(date="2026-08-19", limit=10):
if race.meeting == "York":
print(f"\nYork race found: {race.race_name}, Class {race.race_class}, {race.distance}")
break
print("\nexercised: racecards.list / Racecard fields / Horse fields")
Returns all UK and Irish racecards for a given date. Each race includes meeting venue, going, surface, race time, race name, distance, class, and a full list of runners with horse name, trainer, jockey, odds, weight, draw, and official rating. Makes one request per race to fetch full runner details, so response time scales with the number of races on the card (typically 20-30 races per day).
| Param | Type | Description |
|---|---|---|
| daterequired | string | Race date in ISO format YYYY-MM-DD (e.g. 2026-08-18). |
{
"type": "object",
"fields": {
"racecards": "array of race objects, each containing meeting, country, going, surface, date, time, race_name, distance, race_class, age, runners_count, and horses array",
"total_races": "integer count of races returned"
},
"sample": {
"data": {
"racecards": [
{
"age": "3YO plus",
"date": "2026-08-18",
"time": "13:15",
"going": "Good to Firm",
"horses": [
{
"age": 5,
"draw": 2,
"name": "Hope Rising",
"odds": "1/16",
"jockey": "Rob Hornby",
"weight": "9-9",
"trainer": "Jamie Snowden",
"cloth_number": 1,
"official_rating": 62
}
],
"country": "Wales",
"meeting": "Chepstow",
"surface": "Turf",
"distance": "1m 4f",
"race_name": "Community Engagement Programme Handicap",
"race_class": "6",
"runners_count": 2
}
],
"total_races": 27
},
"status": "success"
}
}About the Sporting Life API
What get_racecards Returns
Calling get_racecards with a date parameter (ISO format YYYY-MM-DD) returns all scheduled UK and Irish races for that day. The top-level response contains a total_races integer and a racecards array. Each object in the array carries meeting-level fields — meeting, country, going, surface, and date — alongside race-level fields: time, race_name, distance, race_class, and age restrictions.
Runner Detail
The runners array inside each race object is where per-horse data lives. Each runner entry includes horse name, trainer, jockey, odds, weight, draw, and official_rating. This gives you everything needed to build a pre-race form guide, model a betting market, or cross-reference entries against external handicap databases.
Coverage and Freshness
The endpoint covers UK and Irish fixtures only. Supplying a future date retrieves scheduled entries with available ante-post or early-price odds; supplying today's date returns the current day's cards as they stand at query time. There is no pagination — all races for the requested date are returned in a single response.
The Sporting Life API is a managed, monitored endpoint for sportinglife.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when sportinglife.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 sportinglife.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 racecard digest that groups races by meeting venue and formats going/surface conditions for punters.
- Track jockey bookings across all races on a given date to identify in-form or overbooked riders.
- Compare official ratings across runners in a race to flag horses running off a lower mark than recent form.
- Aggregate trainer statistics by querying multiple dates and counting runner and winner tallies per trainer.
- Seed a betting odds tracker with morning prices from the
oddsfield and monitor movement throughout the day. - Filter races by
race_classanddistanceto build a dataset of handicap sprints or Group-level contests. - Populate a fantasy racing game with authentic draw, weight, and jockey assignments from live racecards.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Sporting Life have an official developer API?+
What does the runners array contain for each horse?+
Does the API cover Irish racing separately from UK racing?+
get_racecards response. Each race object carries a country field so you can filter or separate fixtures by jurisdiction after retrieval.