Sporting Life Scraper - Racecards, Results & Odds API avatar

Sporting Life Scraper - Racecards, Results & Odds API

Pricing

Pay per event

Go to Apify Store
Sporting Life Scraper - Racecards, Results & Odds API

Sporting Life Scraper - Racecards, Results & Odds API

Scrape Sporting Life horse racing: racecards, results, runners, weights, official ratings, Timeform commentary, bookmaker odds, tote payouts, and horse, jockey and trainer profiles. UK, Ireland, France and USA. No login, no API key, no proxy.

Pricing

Pay per event

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Share

ParseForge

Sporting Life Scraper - Racecards, Results & Odds API

Scrape Sporting Life horse racing: racecards, results, runners, odds, and form. Every runner comes with its weight, official rating, draw, headgear, trainer, jockey, owner, market price, Timeform commentary, and finishing position. UK, Irish, French, and US cards, with results going back two decades. No login, no API key, no cookies, and no proxy. Export to CSV, JSON, Excel, or XML.

Sporting Life publishes the Press Association and Timeform racing feed to anonymous visitors. This reads that same public feed, filters it by course, country, class, going, price, or connections, and returns each match in one flat schema.

Who uses itWhat they scrape Sporting Life for
Betting modellersRunner-level training data with prices, ratings, and results in one row
Tipsters and analystsToday's cards with Timeform verdicts, market moves, and best available odds
Odds comparison sitesLive prices from every bookmaker on the card, refreshed per race
Racing media and bloggersFast results, tote payouts, and replays minutes after the weigh-in
Bloodstock and form researchersTwenty years of results with pedigree, connections, and full form lines

What it does

This Actor collects public Sporting Life racing data from four source types — race days, individual races, profile IDs, and any sportinglife.com racing URL — and returns each runner as a flat row. Every runner carries:

  • 🏇 The runner: horse name, age, sex, cloth number, draw, weight carried in stones and pounds, official rating, headgear, medication, and jockey's claim.
  • 🏁 The result: finishing position, distance beaten, winner and placed flags, and the reason a horse did not complete.
  • 💷 The market: starting price as fraction and decimal, implied probability, opening price, full price history, market move, favourite flag, and market rank.
  • 🧠 Timeform's words: the pre-race commentary for each runner, the race verdict with its selections, and the in-running comment after the race.
  • 👥 Connections: trainer, jockey, and owner, each with the ID and profile URL to follow up.
  • 🗓️ Race and meeting context: course, country, surface, going, distance in yards, class, age band, handicap flag, prize money, field size, weather, and off time.
  • 🎟️ Tote returns: win, place, exacta, trifecta, tricast, swingers, straight forecast, placepot, and quadpot on settled races.
  • 📈 Computed signals: decimal odds, implied probability, market rank, lifetime win percentage, and distance in yards, ready to sort.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

What you can do with Sporting Life data

🧮 Build a racing model.

Pull several seasons of results with includeHorseForm and get every runner's weight, rating, going, draw, and starting price alongside where it finished.

📊 Compare bookmaker prices on today's card.

Tick includeBookmakerOdds and each runner arrives with every firm's fractional and decimal price, each-way terms, places paid, and the best price on offer.

🔔 Watch one trainer or jockey.

Set trainerNameContains or jockeyNameContains and schedule the run daily to get only their runners, with prices and results.

⏱️ Read today's results as they land.

Sporting Life's fast-results feed settles within a minute of the weigh-in. Run the same day with raceStages: ["WEIGHEDIN"] and every finished race arrives with its finishing order, distances beaten, and tote returns.

🏆 Track a course or a festival.

Set courses and a date range to collect a whole meeting, or use outputMode: meetings for one row per race day with its card nested.

📜 Rebuild a historical archive.

Results reach back to early 2005, solid from that April. Run a month at a time and page through the years.

Why choose this scraper

What you get
No login, everNo account, no cookies, no session to keep alive. Nothing to get banned.
No proxy costSporting Life serves this feed to anonymous clients, so there is no proxy line on your bill.
Timeform words includedPer-runner commentary and the race verdict, not just numbers.
Four countries, one runBritain, Ireland, France, and the United States on the same card listing.
Twenty years of resultsRacecards run about five days ahead; results go back to early 2005.
Three row shapesOne row per runner, per race with runners nested, or per meeting with the card nested.
Filters that cut noiseCourse, country, class, surface, going, prize, time, rating, age, price, and connections. Only matching rows are written and billed.
Opt-in extras, off by defaultBookmaker odds, form history, pedigree, replays, naps, and articles are each a checkbox. Leave them off and you are never billed for them.

How it compares

Be clear about the trade-off before you pick this one.

This Actor covers the cards Sporting Life publishes. That is Britain, Ireland, France, and a US selection. It is not a global feed: for Japanese, Hong Kong, or Australian racing you need a scraper built on those sites.

FeatureParseForgejungle_synthesizeralaricus0xgollum
SourceSporting Life (UK, IRE, FR, US)Equibase (US)HKJC (Hong Kong)Mixed feeds
Runner-level rows with weights and ratingsYesYesYesPartial
Timeform commentary and race verdictYesNoNoNo
Live bookmaker prices, multiple firmsOptionalNoNoNo
Tote, exacta, trifecta, placepot returnsYesPartialYesNo
Full form history per runnerOptionalOptionalNoNo
Horse, jockey, and trainer profile rowsYesYesNoNo
Historical archive depthBack to early 2005RecentRecentRecent
Price per 1,000 runners$7.00~$1.00~$15.00Not published

The per-runner price is the honest headline: this Actor costs about seven times the cheapest US racing scraper on the Store. What the difference buys is the columns above — Timeform's written analysis, live multi-bookmaker prices, tote returns, and a two-decade archive — on a feed that never needs a proxy. If your job is bulk US chart data at the lowest unit price, use theirs.

What a runner row looks like

{
"recordType": "runner",
"meetingId": 120938,
"meetingDate": "2026-08-24",
"courseId": 301,
"courseName": "Brighton",
"countryCode": "ENG",
"countryName": "England",
"meetingGoing": "Good to Firm (Good in places)",
"meetingSurface": "Turf",
"weather": "Fine",
"raceId": 934627,
"raceName": "Blackmore Building Contractors Handicap",
"raceUrl": "https://www.sportinglife.com/racing/results/2026-08-24/brighton/934627/blackmore-building-contractors-handicap",
"raceDate": "2026-08-24",
"raceTime": "13:30",
"offTime": "13:30:12",
"raceType": "FLAT",
"raceClass": "5",
"ageBand": "4YO plus",
"distance": "5f 60y",
"distanceYards": 1160,
"surface": "TURF",
"going": "Good to Firm (Good in places)",
"isHandicap": true,
"raceStage": "WEIGHEDIN",
"declaredRunners": 6,
"winningTime": "1m 0.75s",
"winningTimeSeconds": 60.75,
"verdict": "SOUTH SHORE has made a positive start for his present stable...",
"firstPrize": 4187,
"prizeCurrency": "GBP",
"totalPrize": 7870,
"placesPaid": 2,
"bookPercentage": 111.12,
"toteWin": "5.0 GBP",
"toteExacta": "14.2 GBP",
"placepot": "136.8 GBP",
"rideId": 251626285,
"clothNumber": 1,
"drawNumber": 5,
"finishPosition": 1,
"finishDistance": null,
"isWinner": true,
"isPlaced": true,
"horseId": 1165390,
"horseName": "Em Four",
"horseUrl": "https://www.sportinglife.com/racing/profiles/horse/1165390",
"horseAge": 4,
"horseSexLabel": "Gelding",
"foaledDate": "2022-03-28",
"daysSinceLastRun": 35,
"formSummary": "135785",
"weight": "9-9",
"weightPounds": 135,
"officialRating": 74,
"headgear": [],
"ownerName": "Mr J A Osborne",
"trainerId": 197,
"trainerName": "J A Osborne",
"jockeyId": 29850,
"jockeyName": "Saffie Osborne",
"odds": "4/1",
"oddsDecimal": 5,
"impliedProbability": 20,
"openingOdds": "7/2",
"oddsHistory": ["4/1", "7/2", "10/3", "7/2"],
"betMovement": "tchd 10/3",
"isFavourite": false,
"marketRank": 3,
"lifetimeRuns": 33,
"lifetimeWins": 7,
"lifetimeWinPercent": 21.2,
"commentary": "Won 3 times on all-weather earlier in the year and arrives in good heart...",
"runningComment": "Mounted in chute, wore hood and went early to post, midfield, progress over 2f out...",
"silkUrl": "https://www.sportinglife.com/images/silks/20260824bgh143001.png",
"fieldSize": 6,
"scrapedAt": "2026-08-25T16:44:43.346Z"
}

Upcoming races have no finishPosition, winningTime, or tote returns yet, and settled races no longer carry live bookmaker prices. raceType is stated by the feed only once a race has run, so it is null on tomorrow's card. Those are the data's real state, not gaps in the parser.

Configure the run

Drive the Actor from four source types, alone or together: a date range, Sporting Life URLs, race IDs, and horse, jockey, or trainer IDs. Filters run as each race and runner is read, so only matches reach your dataset. With nothing set it scrapes today's racecards. The Input tab lists every parameter.

Today's card for two courses:

{ "dateFrom": "2026-08-26", "courses": ["Ascot", "Newmarket"], "maxItems": 300 }

A week of results, with each horse's form history attached:

{ "dateFrom": "2026-08-01", "dateTo": "2026-08-07", "raceStages": ["WEIGHEDIN"], "includeHorseForm": true, "maxItems": 5000 }

Tomorrow's Irish card with every bookmaker's price:

{ "dateFrom": "2026-08-27", "countries": ["Eire"], "includeBookmakerOdds": true, "maxItems": 400 }

One trainer's runners over a season, winners only:

{ "dateFrom": "2026-04-01", "dateTo": "2026-09-30", "trainerNameContains": ["Appleby"], "finishPositions": ["winner"], "maxItems": 2000 }

A single race by URL, with replay and last year's winners:

{ "startUrls": ["https://www.sportinglife.com/racing/racecards/2026-08-26/catterick/racecard/934971/berber-leather-maiden-stakes"], "includeVideos": true, "includeLastYearsWinners": true }

Pricing

Pay-per-event: $0.007 per runner, plus a $0.01 fee per race day scanned and a $0.03 run-start fee. You pay only for rows written to your dataset. Every optional block is a separate event that is charged only when you tick its checkbox.

Runners collectedApproximate cost
100$0.74
1,000$7.04
10,000$70.13

Choosing outputMode: races bills $0.05 per race instead, with the whole field nested in one row. On an average nine-runner card that is cheaper than per-runner billing; on a five-runner field it is dearer. outputMode: meetings bills $0.02 per meeting.

Optional blocks: bookmaker odds $0.003 per runner, form history $0.003 per runner, horse profile and pedigree $0.008 per horse, race replay $0.003 per race with a direct MP4, tipster nap $0.003 per row, article $0.004 per row. Standalone jockey and trainer profile rows are $0.008 each.

New Apify accounts start with $5 in free credit.

Free users

Free-plan runs return up to 10 rows as a preview. Upgrade your Apify plan to collect up to 1,000,000 rows per run.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Sporting Life Racing Scraper.
  3. Set dateFrom and dateTo, or paste Sporting Life URLs, add any filters, and click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to racing data through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/sporting-life-racing-scraper"

Then prompt it in plain language:

  • "Pull today's Ascot card and list every runner with its price and official rating."
  • "Get last Saturday's British results and tell me which favourites won."
  • "Compare bookmaker prices for tomorrow's 15:30 at Newmarket."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/sporting-life-racing-scraper" to collect horse racing data from Sporting Life. Input: { "dateFrom": "<YYYY-MM-DD>", "dateTo": "<YYYY-MM-DD>", "courses": ["<course>"], "countries": ["<country>"], "includeBookmakerOdds": <true|false>, "maxItems": <n> }. It returns one row per runner with horse, age, weight, official rating, trainer, jockey, odds, Timeform commentary, finishing position, and race and meeting context. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why am I getting no results?

Check the date. There is no racing on some days, and racecards are only published about five days ahead — a date further out returns nothing but the odd early entry for a big autumn race. Filters stack, so a course plus a class plus a going term can leave zero races; drop them one at a time.

Why are the bookmaker odds empty?

Prices are live markets with a narrow window. Firms price up on the morning of the race, so a card pulled the night before returns SP from every firm and no usable price — that costs you nothing, because the block only bills when a real price is delivered. Once a race is settled the market is gone. Use the starting price in odds and oddsDecimal for past races.

Why is a replay URL missing?

Sporting Life carries two video providers. Racing TV courses ship a direct MP4, which lands in replayUrl. At The Races courses ship only a host-less provider path, which lands in replayStreamPath and is never billed. About 45% of replays are direct MP4s.

Why is raceType null?

Sporting Life states flat, hurdle, or chase only in a horse's own form lines, which means it resolves once a race has been run. Tomorrow's card does not have it yet.

Why fewer rows than I asked for?

maxItems is a ceiling, not a target. The day may hold fewer runners than that, or your filters removed them. Widen the date range or relax the filters.

Why is the run slow?

includePedigree and includeFutureEntries fetch one profile per horse, which multiplies requests on a big card. Turn them off for bulk runs, or lower racesPerDay.

A field stopped filling.

Sporting Life changed its public response shape. Email us with your run ID so we can update the parser.

FAQ

QuestionAnswer
Do I need a Sporting Life account or API key?No. It reads the public racing feed, so there is no login, cookie, or token to manage.
Which countries are covered?Britain, Ireland, France, and a United States selection, as published on Sporting Life's own card listing.
How far back do results go?To early 2005, solid from that April. Racecards run about five days into the future.
Can I get odds from more than one bookmaker?Yes. Tick includeBookmakerOdds and each runner returns every firm Sporting Life carries, plus the best price and who offers it.
Can I download race replays?Partly. Tick includeVideos: Racing TV courses return a direct MP4 URL, At The Races courses return only a provider path with no host. You are billed only for the usable MP4s.
Does it return the full form history?Yes, with includeHorseForm: each previous run's date, course, distance, going, weight, rating, starting price, and the in-running comment.
Can I filter by trainer, jockey, or owner?Yes, by partial name. Filters run before rows are written, so only matches are billed.
Is a proxy needed?No. The feed answers anonymous datacenter requests, so the proxy field can stay off.
How many rows per run?Free plan: 10. Paid: up to 1,000,000, bounded by what the cards and filters return.
What is marketRank?The runner's price position in its own race, 1 being the shortest. Computed here, not published by Sporting Life.
How is the favourite decided?Sporting Life flags it only once a race has run. On an upcoming card isFavourite falls back to the shortest price, which agreed with the flag on every settled race tested. Joint favourites all get the flag.
Is this an official Sporting Life product?No. It is unofficial and reads only publicly available Sporting Life data.

Browse the full ParseForge collection for more scrapers.

🆘 Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Sporting Life, Sky Betting & Gaming, or Timeform. It collects only publicly available Sporting Life data. You are responsible for using the data in compliance with Sporting Life's terms and applicable laws, including GDPR, CCPA, and PIPL. Gambling carries risk; nothing here is betting advice.