---
title: "The market's path per runner, stored at the jump: consensus at fixed marks, moves, breadth, first mover, signal"
method: GET
path: "/v1/racing/market-summary"
tags: ["Racing Archive"]
---

# The market's path per runner, stored at the jump: consensus at fixed marks, moves, breadth, first mover, signal

`GET /v1/racing/market-summary`

## Request

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

Cost: 5 credits (JSON) / 20 credits (CSV). 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.

## Query parameters

- `from` string, nullable: ISO date/time on the race start. Defaults to the table's floor.
- `to` string, nullable: ISO date/time. Defaults to now.
- `date` string, nullable: Single-day alias: date=YYYY-MM-DD is exactly from=YYYY-MM-DD&to=YYYY-MM-DD. Mutually exclusive with from/to.
- `venue` string, nullable: Venue name, case-insensitive, exact match.
- `category` string, nullable: horse, harness or greyhound — comma-separated for more than one.
- `categories` string, nullable: Alias of `category`. Comma-separated horse, harness, greyhound. Both spellings are accepted on every racing endpoint.
- `country` string, nullable: Two-letter country code, e.g. AU, NZ.
- `race_id` string, nullable: One race.
- `signal` string, nullable: Comma-separated signal classes to keep: strong_firm, firm, steady, drift, strong_drift, insufficient.
- `format` string: csv streams a flat table with a stable column order.
- `limit` integer
- `offset` integer

## Headers

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

## Response `200`

Successful Response

- MarketSummaryOut
  - `rows_returned` integer, required
  - `total_rows` integer, required: Rows matching the filter before limit/offset.
  - `limit` integer, required
  - `offset` integer, required
  - `summary_from` string, nullable: Earliest start_time in the table. The summary is built from the 45-day tick store, so it begins where that store stood when the job first ran.
  - `window_days` integer, nullable: Set when the caller's plan clamps the lookback. NULL means the whole table.
  - `rows` 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
- `403`: A paid endpoint; the refusal is free and names the tiers.
- `422`: Unparseable parameter or unknown signal. Nothing was charged.
- `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)
