RapidOddsAPI bookmaker odds API logoRapidOddsAPI
Home/Racing Results API
Results · Australia & New Zealand

Horse Racing Results API

Finishing positions and margins for every runner, in every Australian and New Zealand thoroughbred and harness race and every Australian greyhound race. Results land minutes after the finish, under the same race ID as the odds.

See Racing PlansRead the Results Docs

Race results, matched to the odds

Odds tell you what the market thought. Results tell you what happened. Our racing results API gives you the finishing order of every race we carry odds for: position, saddlecloth number, name and margin for each runner, with scratched runners flagged.

Every result uses the same race_id as the race in our odds feed, and runners are keyed by the same number. Settling a bet, scoring a tipping comp or grading a model is a lookup on two keys, with no name matching and no track spellings to reconcile.

Results are kept for 30 days, so you can rerun last week, catch up after downtime or backfill a database without scraping anything yourself.

How fast results arrive

Each race's result fills in over the minutes after it finishes:

1

A couple of minutes after the finish: An interim result, usually just the winner.

2

Around ten minutes after the finish: The result goes final, with the placings.

3

A few minutes after that: The rest of the field is filled in, down to last place.

Each step is a full update with the whole field, so just keep the latest. A result never goes back from final to interim.

What's in every result

Each result carries the race details (track, country, race number, start time) plus these fields. Runners come in finishing order, with scratched runners at the end:

race_idSame id as the race in the odds feed
statusinterim, final or abandoned
positionFinishing position (null if scratched)
numberRunner number, the same as in the odds
nameRunner name
marginLengths behind the winner
scratchedtrue if the runner was scratched

A dead heat shows as two runners with the same position. An abandoned race comes back with status: "abandoned" and no runners.

Fetch racing results

One endpoint, /racing/results. Every parameter is optional: with none you get today's thoroughbred results. Filter by track, date (any day in the last 30), code, countries, or ask for a single race_id:

# Every thoroughbred result so far today curl "https://api.rapidoddsapi.com/racing/results?api_key=your_api_key" # One meeting curl "https://api.rapidoddsapi.com/racing/results?api_key=your_api_key&track=Newcastle" # Yesterday's greyhound results curl "https://api.rapidoddsapi.com/racing/results?api_key=your_api_key&code=greyhound&date=2026-10-25" # One race, by the race_id from the odds curl "https://api.rapidoddsapi.com/racing/results?api_key=your_api_key&race_id=thoroughbred_2026-10-26_Newcastle_1"

Example results response

{ "results": [ { "race_id": "thoroughbred_2026-10-26_Newcastle_1", "code": "thoroughbred", "track": "Newcastle", "country": "AU", "race_number": 1, "start_time": "2026-10-26T02:50:00Z", "status": "final", "runners": [ { "position": 1, "number": 6, "name": "Astrogazer", "margin": null, "scratched": false }, { "position": 2, "number": 8, "name": "Smart Jazz", "margin": 0.49, "scratched": false }, { "position": 3, "number": 3, "name": "D'Oro Choice", "margin": 1.21, "scratched": false }, { "position": 4, "number": 2, "name": "Sound And Vision", "margin": 1.29, "scratched": false }, { "position": null, "number": 4, "name": "Rebel's Edge", "margin": null, "scratched": true } ], "last_update": "2026-10-26T03:02:21Z" } ] }

Settle a bet in a few lines

Because a result shares its race_id and runner number with the odds, settling is a lookup, not a matching job:

import requests BASE = "https://api.rapidoddsapi.com/racing" KEY = "your_api_key" # A win bet you placed earlier, from the odds feed bet = {"race_id": "thoroughbred_2026-10-26_Newcastle_1", "number": 6, "stake": 10, "price": 4.2} result = requests.get(f"{BASE}/results", params={"api_key": KEY, "race_id": bet["race_id"]}).json()["results"][0] if result["status"] == "final": runner = next(r for r in result["runners"] if r["number"] == bet["number"]) profit = bet["stake"] * (bet["price"] - 1) if runner["position"] == 1 else -bet["stake"] print(runner["name"], "finished", runner["position"], "->", profit)

Results over WebSocket

Already streaming odds? Add "results": true to your subscribe message and each result is pushed to you as a race_result message the moment it lands, for the same tracks you follow. Leave it off and nothing changes:

wss://api.rapidoddsapi.com/racing/ws?api_key=your_api_key { "action": "subscribe", "tracks": "*", "countries": ["AU"], "results": true }

Why use our racing results API

  • Every runner in the field, not just the placegetters
  • Margins in lengths behind the winner
  • Same race_id and runner number as the odds, so results join straight on
  • Thoroughbreds, harness and greyhounds in one endpoint
  • 30 days of results on tap
  • Pushed over WebSocket as each result lands, if you want it

Pricing

Results are part of racing, so they come with the Pro and Elite plans and the $99/mo Racing plan. No credits, 120 requests a minute. Compare plans →

Pair it with live prices from the horse racing odds API, the harness racing odds API or the greyhound odds API.

Racing Results API FAQ

How quickly do results come through?

An interim result, usually the winner, arrives a couple of minutes after the finish. The final result follows around ten minutes after the race, and the rest of the field is added a few minutes after that.

Which races have results?

Every Australian and New Zealand thoroughbred and harness race and every Australian greyhound race in our odds feed. Pick the code with code=thoroughbred, harness or greyhound.

How far back do results go?

30 days. Pass any meeting date from the last 30 days as date=YYYY-MM-DD.

How are dead heats and abandoned races shown?

A dead heat shows as two runners with the same position. An abandoned race comes back with status abandoned and no runners.

Do results include dividends or starting prices?

No. Results are finishing positions and margins. For prices, use the odds feed, which carries fixed win and place odds from every bookmaker up to the jump.

How do I match a result to the odds I pulled?

Use race_id. A result has exactly the same race_id as the race in /racing/races, and runners share the same number, so it is a straight join.

Which plans include the results API?

Pro, Elite and the $99/mo Racing plan. Results use no credits and share the 120 requests per minute racing limit.

Start building with racing results

Finishing positions and margins for every runner, in every Australian and New Zealand thoroughbred and harness race and every Australian greyhound race. Results land minutes after the finish, under the same race ID as the odds.