---
title: "Racing price history / closing line"
method: GET
path: "/v1/racing/price-history"
tags: ["Racing"]
---

# Racing price history / closing line

`GET /v1/racing/price-history`

## Request

- Base URL: `https://api.puntersedge.online`
- URL: `https://api.puntersedge.online/v1/racing/price-history`
- Auth: API key in header `X-API-Key`

Cost: 5 credits. Every price move for a race, per runner per bookmaker, with the opening
and closing line.

Identify the race either by `race_id`, or by `venue` + `race_number` + `date` — use the latter
for past races, because race ids are only resolvable from the live feed, which holds the next
~6 hours.

**The series is change-only.** Each point is a price MOVE, not a sample: a gap means the price
held steady. `move_pct` is open→close, positive meaning the price drifted out.

**`open_price` and `close_price` are the first and last CAPTURED prices for that book, not
guaranteed market open and close.** Capture starts when a race enters the 60-minute window,
and a book that does not quote that early gets its first price whenever it starts quoting:
measured over 30,448 series on 2026-08-15, 44% of series began at the 60-minute baseline and
56% began later. At the other end 63% of series have a final point inside 120s of the jump
and 81% inside 300s, so the rest are not closing lines either. Read `open_secs_to_jump`,
`close_secs_to_jump` and `open_is_baseline` on each bookmaker before using a series for
closing-line value, and drop the ones that do not reach the jump.

**History is permanent.** Races inside the ~45-day live window are served from the live
store; older races come from the permanent archive, which is never purged. `history_from`
on the response is the true floor — capture began 2026-08-04, and the archive only
deepens from there. (Identify past races by `venue` + `race_number` + `date`; both stores
resolve that key.)

**Past races are Standard and above.** Every plan reads every upcoming race and any race
that started in the last 24 hours. A race that started earlier needs Standard or above;
on Free and Hobby it is a 403 that charges nothing and carries a `sample` of what the call
returns, from one recent race.

## Query parameters

- `race_id` string: Race id. If omitted, give venue + race_number + date.
- `venue` string: Venue name, case-insensitive (with race_number + date)
- `race_number` integer
- `date` string: Race date, YYYY-MM-DD (YYYYMMDD accepted): the UTC day of the race's start, or, when that finds nothing, the Australian Eastern meeting date, so the date /v1/racing/results and /v1/racing/closing-lines give a race resolves it here too. A date that resolves nothing is a free 404 naming the venue's races with history around it.
- `bookmakers` string: Comma-separated bookmaker keys, case-insensitive. An unrecognised key is a free 422 naming the valid keys, so a typo costs nothing.
- `include_points` boolean: False returns open/close/high/low only
- `max_points` integer: Cap on returned points; response flags truncation

## Headers

- `X-API-Key` string
- `X-RapidAPI-Proxy-Secret` string

## Response `200`

Successful Response

- PriceHistoryOut
  - `race_id` string, required
  - `venue` string, nullable, required
  - `venue_id` string, nullable
  - `venue_canonical` string, nullable
  - `venue_site` string, nullable
  - `race_number` integer, nullable, required
  - `category` string, nullable, required
  - `country` string, nullable, required
  - `start_time` string, required
  - `points_returned` integer, required
  - `truncated` boolean, required
  - `history_from` string, nullable: Start time of the earliest race this endpoint can answer for. Since 2026-09-01 races older than the ~45-day live window are served from the permanent archive, so this floor is fixed at capture start (2026-08-04) and history only deepens.
  - `runners` object[], required

## Other responses

- `401`: Missing or invalid API key. Send `X-API-Key`. See https://puntersedge.online/developers/errors
- `402`: Monthly credit allowance exhausted for this plan. Upgrade at https://puntersedge.online/api/pricing
- `422`: Validation Error
- `429`: Rate limit exceeded for this plan. Honour the `Retry-After` header (seconds) before retrying. See https://puntersedge.online/developers/rate-limits
- `500`: Unexpected server error. Safe to retry with backoff.

---

[API](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api.md) · [All operations](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api/llms.txt) · [OpenAPI document](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api/revisions/f35b6aab1946?raw)
