Horse & Greyhound Racing Results API
Finishing positions and margins for completed races, as structured JSON. Thoroughbred, harness and greyhound results for international racing — one race, or an entire meeting in a single call. Premium adds results as races settle and live bookmaker prices on the same runners.
What's in a Race Result
Enough to settle a card, score a tipping competition, or close the loop on a prediction model.
Finishing Positions & Margins
Every runner that completed the race, with its finishing position and, where published, its cumulative margin behind the winner. Greyhound margins carry a metres suffix; gallops and harness are lengths. Dead heats appear as two runners sharing a position.
Scratchings and Non-Finishers
Withdrawn runners stay in the response, flagged as scratched rather than dropped, so your card still reconciles against the form you pulled before the race.
A Whole Meeting Per Call
One request returns every race at a meeting in race-number order — including races still awaiting a result, so the card is always complete instead of full of holes you have to detect.
The Same Parameters as Form
Results take the date, track and race number you already use for race form, so any race you fetched form for can be looked up with the identical query string. No second ID scheme to map.
One Request, One Race Result
Pass the date, track and race number and get every runner back in finishing order. Drop the race number and call /v1/results/meeting instead to pull the entire meeting at once.
- Finishing position, 1 = winner, with dead heats sharing a position
- Margin behind the winner — lengths for gallops and harness, metres for greyhounds
- Runner number, name, barrier or box, and allocated weight
- Jockey or driver and trainer for each runner
- Scratchings flagged in place, never silently removed
- Race context — name, class, distance, prize money, condition and weather
- resultStatus per race: final, interim, pending or abandoned
{
"date": "2026-07-25",
"track": "Caulfield",
"raceNumber": 1,
"distance": "1200m",
"condition": "Good 4",
"numberOfRunners": 10,
"resultStatus": "final",
"placings": [
{
"number": 3,
"name": "Custom",
"jockey": "J. McDonald",
"trainer": "C. Waller",
"barrier": 4,
"position": 1,
"margin": "0.0",
"scratched": false
},
{
"number": 7,
"name": "Sun Setting",
"jockey": "M. Dee",
"trainer": "G. Waterhouse",
"barrier": 2,
"position": 2,
"margin": "3.0",
"scratched": false
}
]
}Results Coverage
Results cover every meeting FormFav serves race form for: thoroughbred, harness and greyhound racing across 24+ countries, requested with the same parameters as the racing data feed.
How much each result carries varies by market. Some arrive with margins and the official starting price, others with finishing positions alone, and coverage deepens as sources are added.
How the Results Feed Behaves
Batch-ingested on Free and Pro
On Free and Pro, results are ingested by a pipeline that runs every 2–3 hours rather than streamed, so expect a lag between a race finishing and its result landing. Premium and Enterprise get results as races settle, with interim and correct-weight stages. Each race carries a resultStatus, so a race that has not been run is distinguishable from one that has run but is not ingested yet — an unresulted race returns 200 with resultStatus "pending", never a 404. Read that field instead of polling in a tight loop.
A rolling window, not an archive
Results are available from 30 days in the past to 7 days ahead. FormFav is a working feed for recent racing, not a historical results database — if you need decades of past results, this is not the right source.
Independent racing data, not an official results service
FormFav publishes independent racing data and derived statistics. It is not an official race fields feed and is not the official record of any race result — where a result is contested, corrected or subject to protest, the relevant racing authority's own publication governs. If you are a licensed wagering operator, you remain responsible for any approvals your operations require and for sourcing official racing materials through an authorised distributor.
Real-Time Results and Live Prices
Batch ingestion is fine for settling a tipping competition the next morning. It is not fine for an in-play model or a trading tool. Premium moves the same endpoints onto a real-time feed, with no parameter or URL change, so an integration built on Pro gains the following the moment the key is upgraded.
Results as races settle
Finishing positions reach you from the real-time feed before the batch pipeline has the race at all. Each early position carries a resultStage — interim while stewards are still to confirm, correct_weight once they have — so you can act on a provisional result and know exactly how provisional it is.
Live win and place prices per bookmaker
GET /v1/prices returns current win and place prices for every runner, one entry per bookmaker and market type, with opening, high and low prices and movement history. The same prices appear inline on results for Premium keys. Responses are cached for 5 seconds at the edge, so poll every 5–10 seconds through the last minutes before the jump.
Live scratchings, track condition and weather
A scratching, a track downgrade or a weather change reaches race form as it is declared rather than with the next batch run, so the runners you price are the runners that will actually jump.
Close the Loop on Every Race
Results are part of the Pro tier, alongside predictions, speed maps, and jockey and trainer statistics. Pro starts with a 7-day free trial, Premium adds real-time results and live prices, and the free tier gives you race form and career stats for as long as you want them.