18+ Only  |  Gambling can be addictive — please gamble responsibly  |  Gambling Help: 1800 858 858  |  GambleAware
For your own betting, models and research

Racing odds for your own models and research

Live prices from all 15 Australian racing bookmakers the API serves, the results, price history and the closing-line archive, for Australian and New Zealand racing. JSON you can pull into Python, R or a spreadsheet.

What people use it for

Watch the market before the jump

Every runner's price at every book on the next races, with the age of each quote, and the runners that are firming or drifting.

Test a model against the close

The closing price of each race at each book, the price path that led to it, and closing-line value for bets you have placed.

Settle and grade your bets

Results with placings and dividends, keyed by the same race ids as the prices.

Build form features

Each runner's recent runs and each dog's record by track, distance and box, from the results we settle ourselves.

The endpoints you will use

EndpointWhat it returnsCredits per callPlans
GET /v1/racing/next-to-goNext races to run2–4 credits Every plan
GET /v1/racing/moversRacing steamers and drifters3 credits Every plan
GET /v1/racing/resultsSettled race results2 credits Every plan
GET /v1/racing/price-historyRacing price history / closing line5 credits Every plan
GET /v1/racing/closing-linesPermanent closing-line and result archive5–20 credits From Standard (fuller access on higher plans)
GET /v1/racing/price-pathsBulk export of the permanent price-movement archive5–20 credits From Plus
POST /v1/racing/clvScore bets against the closing line (CLV)5 credits From Plus
GET /v1/racing/formEvery runner in one race with its recent runs, from our own results3 credits Every plan
GET /v1/racing/greyhounds/statsGreyhound record by track, distance, box or grade, from our own results3 credits Every plan
GET /v1/sports/{sport_key}/closing-linesClosing price and line per bookmaker, with the consensus5 credits From Standard

Read from the API itself; every endpoint is in the API reference and on what each endpoint does.

A first call in Python

Put your key in an environment variable, then ask for the next races. Every quote carries its own age.

import os, requests

r = requests.get(
    "https://api.puntersedge.online/v1/racing/next-to-go",
    headers={"X-API-Key": os.environ["PUNTERSEDGE_API_KEY"]},
    params={"num_races": 5, "categories": "horse"},
)
for race in r.json():
    print(race["venue"], race["race_number"], race["start_time"])
    for runner in race["runners"]:
        quotes = [b for b in runner["bookmakers"] if b.get("win_price")]
        if quotes:
            best = max(quotes, key=lambda b: b["win_price"])
            print("  ", runner["name"], best["key"], best["win_price"], f'{best["age_seconds"]}s old')

One race from the response, trimmed to one runner and two bookmakers (the API's documented example):

{
  "category": "horse",
  "country": "AU",
  "data_age_seconds": 7,
  "race_id": "race_123",
  "race_number": 4,
  "refresh_tier": "live",
  "runners": [
    {
      "bookmakers": [
        {
          "age_seconds": 7,
          "key": "sportsbet",
          "refresh_tier": "live",
          "source_url": "https://www.sportsbet.com.au/horse-racing/australia-nz/eagle-farm/race-4-10861234",
          "stale": false,
          "win_price": 3.2
        },
        {
          "age_seconds": 9,
          "betslip_app_only": false,
          "betslip_place_url": "https://www.unibet.com.au/racing?competitorKey=202609030600.T.AUS.mackay.4.emilia_jane&priceCode=FXD&marketName=Place&priceBetType=FixedPlace#/event/202609030600.T.AUS.mackay.4/Place/FixedPlace",
          "betslip_win_url": "https://www.unibet.com.au/racing?competitorKey=202609030600.T.AUS.mackay.4.emilia_jane&priceCode=FXD&marketName=Win&priceBetType=FixedWin#/event/202609030600.T.AUS.mackay.4/Win/FixedWin",
          "key": "unibet",
          "place_price": 1.55,
          "refresh_tier": "live",
          "source_url": "https://www.unibet.com.au/racing#/event/202609030600.T.AUS.mackay.4",
          "stale": false,
          "win_price": 3.3
        }
      ],
      "horse_ref": "pe:examplerunner",
      "name": "Example Runner",
      "number": 1
    }
  ],
  "source_id": "src_a1b2c3d4e5",
  "stale": false,
  "start_time": "2026-06-07T04:10:00Z",
  "venue": "Eagle Farm"
}

Which plan fits

Most research starts on the free key. The archive is usually what moves people up: the last column shows how much of it each plan opens.

PlanPriceCredits / monthRate limitLicenceWhat it adds
FreeA$03,00030 requests/minute Personal use — Free key
HobbyA$97,50060 requests/minute Personal use — Choose
StandardA$2975,000200 requests/minute Personal use Over Hobby: Last 90 days of the closing-line archive; Price history on past races; Historical sports odds and movements Choose
PlusA$49140,000500 requests/minute Display with attribution Over Standard: Permanent closing-line archive; Bulk price-path exports; Closing-line value scoring Choose

Prices in Australian dollars a month; the limits are the ones the API enforces. Every plan is on the pricing page.

What you may do with the data

These plans carry the Personal use licence, quoted from section 8.1 of the Terms:

You may use the data for yourself: your own betting decisions, your own models, research, backtesting and dashboards you look at. This licence does not cover using the data in a business, doing client work with it, building it into a product you sell, or putting our prices in front of other people.

If what you build will show our prices to other people or earn money, it needs a different licence: see building a product or using the data in a business.

Guides and data to start from

The free tier needs no card. You can upgrade the same key later; nothing you build has to change.

This site contains wagering-related analysis and is intended for Australian users aged 18+. Gambling involves risk. Please gamble responsibly.