18+ Only  |  Gambling can be addictive — please gamble responsibly  |  Gambling Help: 1800 858 858  |  GambleAware

API reference / Racing

POST /v1/racing/clv

Score bets against the closing line (CLV)

Score a list of bets you struck against the closing line each race actually closed at, and get the record back as numbers: per bet the closing price (the named book's, or the market's best or median), the closing-line value in percent, whether it beat the close, the result and the flat-stake P&L; and across the list the average and median CLV, the beat-the-close rate, the win rate and the ROI. **Naming a race.** Send the `race_id` you already hold from next-to-go, events, results or the archive; failing that, `venue` + `meeting_date` (AET) + `race_number`. **Naming a runner.** `runner_ref` (the ra:/grv: registry id on results and the archive) is exact; `runner_number` is the saddlecloth; `runner_name` is matched the way the feeds match names. **What you are measured against.** A closing line is a book's last price within 300 s of the jump. Name a `bookmaker` and `clv_pct` is against that book's close (`close_book`); otherwise against the market `reference` — `best` (the highest close across books, the strictest test) or `median`. `close_best` and `close_median` come back on every bet either way, so you can re-cut the record yourself. **Coverage.** The archive holds AU and NZ races from `archive_floor` onward; a bet before that, or on a race no book priced at the close, resolves with a `reason` and is left out of the averages rather than guessed. Results are settled only when `result_status` is `final`; `won` and `pnl` are null until then. Betfair exchange prices are withheld. Plus and above. Free and paid tiers below Plus receive a 403 and are not charged.

Requires X-API-Key 5 credits per request, up to 200 bets

Request

curl -X POST 'https://api.puntersedge.online/v1/racing/clv' \
  -H 'X-API-Key: YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"bets": [{"bookmaker": "sportsbet", "price": 4.2, "race_id": "au-flemington-2026-09-19-r5", "ref": "bet-1", "runner_name": "Example Horse", "stake": 50}, {"meeting_date": "2026-09-19", "price": 6.0, "race_number": 7, "ref": "bet-2", "runner_number": 3, "venue": "Randwick"}], "reference": "best"}'

Parameters

NameIn TypeRequired Description
bets body array yes Up to 200 bets per request.
reference body string no The market close used when a bet names no bookmaker, and reported as close_best / close_median on every bet regardless: `best` is the highest closing win price across books, `median` the median.

Responses

Status codes: 200, 401, 402, 403, 422, 429, 500. Response bodies are JSON; the full schema is in /openapi.json.

Example response

200 application/json — this call costs 5 credits per request, up to 200 bets. Field names and types are as the API returns them; values are a real sample, trimmed to a few items.

{
  "reference": "spring-2026",
  "archive_floor": "2026-08-18",
  "summary": {
    "bets": 3,
    "resolved": 3,
    "unresolved": 0,
    "scored": 3,
    "avg_clv_pct": 1.11,
    "median_clv_pct": 5.0,
    "beat_close": 2,
    "beat_close_rate_pct": 66.7,
    "resulted": 3,
    "wins": 1,
    "win_rate_pct": 33.3,
    "staked": 150.0,
    "pnl": 60.0,
    "roi_pct": 40.0
  },
  "bets": [
    {
      "ref": "b-1001",
      "resolved": true,
      "reason": null,
      "race_id": "2f0e2df8-5386-4aae-bbdb-7b784dee3e43",
      "venue": "Grafton",
      "race_number": 1,
      "runner_key": "fabulousfiano",
      "runner_name": "Fabulous Fiano",
      "runner_number": 4,
      "runner_ref": "ra:1147732",
      "bookmaker": "sportsbet",
      "price_taken": 7.5,
      "stake": 50.0,
      "close_book": 7.0,
      "close_best": 8.0,
      "close_median": 7.25,
      "books_at_close": 11,
      "close_reference": 7.0,
      "clv_pct": 7.14,
      "beat_close": true,
      "finish_position": 5,
      "result_status": "final",
      "won": false,
      "pnl": -50.0
    },
    {
      "ref": "b-1002",
      "resolved": true,
      "reason": null,
      "race_id": "104702cc-8a42-4b14-88b0-1fb6de91e913",
      "venue": "Kalgoorlie",
      "race_number": 8,
      "runner_key": "foxwedgearrow",
      "runner_name": "Foxwedge Arrow",
      "runner_number": 2,
      "runner_ref": "ra:1102884",
      "bookmaker": "tab",
      "price_taken": 4.2,
      "stake": 50.0,
      "close_book": 4.0,
      "close_best": 4.4,
      "close_median": 4.1,
      "books_at_close": 10,
      "close_reference": 4.0,
      "clv_pct": 5.0,
      "beat_close": true,
      "finish_position": 1,
      "result_status": "final",
      "won": true,
      "pnl": 160.0
    },
    {
      "ref": "b-1003",
      "resolved": true,
      "reason": null,
      "race_id": "c2cfc9b1-a037-4bcb-841f-5496bb0c9b82",
      "venue": "Tatura",
      "race_number": 1,
      "runner_key": "bellbirdlane",
      "runner_name": "Bellbird Lane",
      "runner_number": 6,
      "runner_ref": null,
      "bookmaker": "ladbrokes_au",
      "price_taken": 3.1,
      "stake": 50.0,
      "close_book": 3.4,
      "close_best": 3.5,
      "close_median": 3.3,
      "books_at_close": 9,
      "close_reference": 3.4,
      "clv_pct": -8.82,
      "beat_close": false,
      "finish_position": 7,
      "result_status": "final",
      "won": false,
      "pnl": -50.0
    }
  ],
  "notes": [
    "CLV is measured against the last price the NAMED bookmaker showed before the jump (close_book). Name no bookmaker, or name one that recorded no close, and close_reference falls back to the market figure — the row says which it used.",
    "A bet whose race or runner is not in the archive comes back resolved=false with a reason and no numbers, rather than being dropped from the response."
  ]
}

Guides that use this endpoint

Related endpoints

Try it against live data

The free tier needs no credit card, and the sandbox endpoints need no key at all.

Get a free API key Quickstart
This site contains wagering-related analysis and is intended for Australian users aged 18+. Gambling involves risk. Please gamble responsibly.