API reference / Racing Archive
GET /v1/racing/market-summaryThe market's path per runner, stored at the jump: consensus at fixed marks, moves, breadth, first mover, signal
The market summary archive: one row per race and runner, written at the jump, carrying the market consensus price at T-60, T-30, T-15, T-10, T-5 and T-2 and at the close, its high and low through the capture window, `move_from_t60_pct` / `move_from_t15_pct` / `move_t5_close_pct` (close against those marks; negative is a runner that shortened), the breadth of the move (books with history, firming, drifting, unchanged), the first attributable book to move with its lead and the followers' median lag, the signal class, and the best closing price against the consensus. **It is GET /v1/racing/intelligence, kept.** The same analysis, run at the jump with the archive's own `consensus_close_price` as the close (`close_source: archive`; a runner the archive could not score falls back to the ticks at the jump, `close_source: ticks`), so a live reading and the stored row are one quantity. The ticks it is built from live in the 45-day snapshot store; this row is permanent, from `summary_from` forward. **Joined at serve time, appended last:** `venue_id`, `venue_site`, `horse_ref`, and the runner's `finish_position` and `result_status` from the closing-line archive, which land after the summary is written. Scratched runners carry no row. **The signal classes against results** are what this table exists for. `signal` filters on them; joined to `finish_position` the table says, for any window, how often each class won and at what price. Those strike rates belong on the market report; until they are printed there, compute them from this table rather than trusting the label. **Plans.** Plus and above read the whole table; Standard a rolling 90-day window (`window_days` 90, `X-Archive-Window-Days`); Free and Hobby a free 403. Standard keys issued before 2026-09-20 keep the whole archive they were sold. `date=` is a single-day alias for `from`/`to`; an unknown parameter, signal or date is a free 422.
X-API-Key
5 credits (JSON) / 20 credits (CSV)
curl 'https://api.puntersedge.online/v1/racing/market-summary?date=2026-10-03&category=horse&signal=strong_firm,firm' \
-H 'X-API-Key: YOUR_KEY'
| Name | In | Type | Required | Description |
|---|---|---|---|---|
from |
query | string | no | ISO date/time on the race start. Defaults to the table's floor. |
to |
query | string | no | ISO date/time. Defaults to now. |
date |
query | string | no | Single-day alias: date=YYYY-MM-DD is exactly from=YYYY-MM-DD&to=YYYY-MM-DD. Mutually exclusive with from/to. |
venue |
query | string | no | Venue name, case-insensitive, exact match. |
category |
query | string | no | horse, harness or greyhound — comma-separated for more than one. |
categories |
query | string | no | Alias of `category`. Comma-separated horse, harness, greyhound. Both spellings are accepted on every racing endpoint since 2026-09-24; before that, using one family's spelling on the other was a hard 422. |
country |
query | string | no | Two-letter country code, e.g. AU, NZ. |
race_id |
query | string | no | One race. |
signal |
query | string | no | Comma-separated signal classes to keep: strong_firm, firm, steady, drift, strong_drift, insufficient. |
format |
query | string | no | csv streams a flat table with a stable column order. |
limit |
query | integer | no | |
offset |
query | integer | no |
Status codes: 200, 401, 402, 403, 422, 429, 500. Response bodies are JSON; the full schema is in /openapi.json.
200 application/json
— this call costs 5 credits (JSON) / 20 credits (CSV).
Field names and types are as the API returns them; values are a real sample, trimmed to a few items.
{
"rows_returned": 2,
"total_rows": 6953,
"limit": 2,
"offset": 0,
"summary_from": "2026-08-21T22:26:00Z",
"window_days": null,
"rows": [
{
"race_id": "ed191df6-9f77-4e35-a7a9-0757d89430d9",
"runner_key": "trantoro",
"venue": "Gawler",
"race_number": 7,
"category": "horse",
"country": "AU",
"start_time": "2026-10-05T06:55:00Z",
"meeting_date_aet": "2026-10-05",
"runner_name": "Trantoro",
"runner_number": 10,
"runner_ref": "ra:NzM2MjcwNDkwMA",
"consensus_t60": 4.77,
"consensus_t30": 4.75,
"consensus_t15": 4.73,
"consensus_t10": 4.74,
"consensus_t5": 4.49,
"consensus_t2": 4.48,
"consensus_close": 4.269,
"close_source": "archive",
"books_t60": 13,
"books_t15": 13,
"books_close": 13,
"consensus_high": 4.77,
"consensus_high_at": "2026-10-05T06:12:04Z",
"consensus_low": 4.27,
"consensus_low_at": "2026-10-05T06:54:04Z",
"move_from_t60_pct": -10.5,
"move_from_t15_pct": -9.75,
"move_t5_close_pct": -4.92,
"ticks_total": 96,
"ticks_last_5m": 42,
"books_with_history": 14,
"books_firming": 14,
"books_drifting": 0,
"books_unchanged": 0,
"first_mover_bookmaker": null,
"first_mover_at": null,
"first_mover_lead_s": null,
"follower_median_lag_s": null,
"signal": "firm",
"best_close_price": 4.4,
"best_close_bookmaker": "betgold",
"best_vs_consensus_pct": 3.07,
"venue_id": "gawler",
"venue_site": "gawler",
"horse_ref": "pe:trantoro",
"finish_position": 1,
"result_status": "final"
},
{
"race_id": "ed191df6-9f77-4e35-a7a9-0757d89430d9",
"runner_key": "willaston",
"venue": "Gawler",
"race_number": 7,
"category": "horse",
"country": "AU",
"start_time": "2026-10-05T06:55:00Z",
"meeting_date_aet": "2026-10-05",
"runner_name": "Willaston",
"runner_number": 16,
"runner_ref": "ra:NzMyOTk0Njc3MA",
"consensus_t60": 44.8,
"consensus_t30": 44.59,
"consensus_t15": 45.82,
"consensus_t10": 49.52,
"consensus_t5": 36.83,
"consensus_t2": 31.58,
"consensus_close": 31.41,
"close_source": "archive",
"books_t60": 13,
"books_t15": 13,
"books_close": 13,
"consensus_high": 50.3,
"consensus_high_at": "2026-10-05T06:43:04Z",
"consensus_low": 31.58,
"consensus_low_at": "2026-10-05T06:53:04Z",
"move_from_t60_pct": -29.89,
"move_from_t15_pct": -31.45,
"move_t5_close_pct": -14.72,
"ticks_total": 100,
"ticks_last_5m": 45,
"books_with_history": 13,
"books_firming": 13,
"books_drifting": 0,
"books_unchanged": 0,
"first_mover_bookmaker": null,
"first_mover_at": null,
"first_mover_lead_s": null,
"follower_median_lag_s": null,
"signal": "strong_firm",
"best_close_price": 34.0,
"best_close_bookmaker": "betr_au",
"best_vs_consensus_pct": 8.25,
"venue_id": "gawler",
"venue_site": "gawler",
"horse_ref": "pe:willaston",
"finish_position": 2,
"result_status": "final"
}
]
}
GET /v1/racing/closing-lines — Permanent closing-line and result archiveGET /v1/racing/closing-lines/coverage — What the closing-line archive actually holdsGET /v1/racing/price-paths — Bulk export of the permanent price-movement archiveThe free tier needs no credit card, and the sandbox endpoints need no key at all.
Get a free API key Quickstart