---
title: "What the closing-line archive actually holds"
method: GET
path: "/v1/racing/closing-lines/coverage"
tags: ["Racing Archive"]
---

# What the closing-line archive actually holds

`GET /v1/racing/closing-lines/coverage`

## Request

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

Cost: 1 credit. The archive's own measurements of itself — depth, date floor, how much
of it is a genuine closing line, how much has a result, and how many rows carry a
contamination flag.

Results are collected for Australian and New Zealand racing from `results_from` onward,
and for British and Irish thoroughbreds from 2026-10-06 (Betway's settlement feed: every
finisher Betway ranks; on Irish races it ranks the first four first and the rest within
about 25 minutes of the off). British and Irish races
are closed by the UK-licensed books
(`ladbrokes_uk`, `williamhill`, `betway_uk`) and the Australian books that quote them;
races in every other country carry closing prices but never a finish position. So
`resulted_races_pct` is the share of the WHOLE archive with a result, while
`settleable_races` / `settleable_resulted_pct` count only AU and NZ races that started
after results collection began — the figure to read if you intend to settle against
the archive. `by_category` carries `resulted_races` per code for the same reason.

`finish_position_pct` is the finish-position fill rate: of the rows whose race has a
result (runners marked scratched left out), the share that carry a position. AU
thoroughbred and greyhound results publish every finisher's position, and AU harness
and NZ results carry the full field from 2026-10-04, so all of them run near 100% on
races from then on; before 2026-10-04 harness and NZ results named the placegetters
only, which holds their whole-archive figure near the placed share of the field.
`by_category` carries it per code.

`consensus_close_pct` (from 2026-10-05) is the share of genuine closing lines that carry
`consensus_close_prob`, the market's margin-free probability stored at the close. Rows
without one belong to races where fewer than two complete-field books closed.

`backtest_ready_rows` / `backtest_ready_pct` count the rows that pass the recommended modelling
filter (genuine closing line, not scratched, no venue-split, name-fragment or duplicate
flag). `closing_by_period` splits `is_closing_line` at 2026-09-29: from that card a row is
also a closing line when the book was still quoting the same price inside 300 seconds of the
jump, so the two periods are measured on different evidence and should be read separately.

**Per book and per join, over a recent window (`days`, default 30).** `by_bookmaker` gives
each book's `closing_pct` and `baseline_pct`: the closing-line rate varies widely between
books, so the archive-wide `is_closing_line_pct` hides the books whose series often stop
early. `races_without_result` counts AU and NZ archive races in the window with no result
at all, and `results_without_race` counts AU and NZ results with no archive race; their
denominators are `settleable_races_in_window` and `results_in_window`, and `definitions`
states each count in one line. Races younger than three hours are left out of both gaps.

This exists so nobody has to take a marketing number on trust before paying for a bulk
pull. Every figure is computed from the table, refreshed at most every ten minutes. Open to every key, Free
included, so you can check the archive before paying for it; the numbers describe the
whole archive. Reading the rows themselves (/v1/racing/closing-lines) is a paid endpoint.

## Query parameters

- `days` integer: Days the per-bookmaker rates and the two result-join gaps are measured over, ending now. Every other figure covers the whole archive.

## Headers

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

## Response `200`

Successful Response

- ArchiveCoverageOut
  - `archive_from` string, nullable, required
  - `archive_to` string, nullable, required
  - `rows` integer, required
  - `races` integer, required
  - `bookmakers` integer, required
  - `is_closing_line_pct` number, required
  - `open_is_baseline_pct` number, required
  - `resulted_races_pct` number, required
  - `results_from` string, nullable, required
  - `settleable_races` integer, required
  - `settleable_resulted_pct` number, required
  - `results_scope` string, required
  - `venue_split_suspect_rows` integer, required
  - `name_fragment_suspect_rows` integer, required
  - `scratched_rows` integer: Rows of runners the result marked scratched (flag from 2026-09-28; hidden from /closing-lines by default).
  - `duplicate_suspect_rows` integer, nullable: Rows whose race appears to duplicate another race record (duplicate_suspect). Null where the archive does not carry the flag. Added 2026-10-19.
  - `backtest_ready_rows` integer: Rows that pass the recommended modelling filter: is_closing_line AND NOT scratched AND NOT venue_split_suspect AND NOT name_fragment_suspect AND NOT duplicate_suspect (an absent flag counts as false). Added 2026-10-19.
  - `backtest_ready_pct` number: backtest_ready_rows as a share of rows. Added 2026-10-19.
  - `closing_by_period` object[]: is_closing_line either side of 2026-09-29, the first card on which a steady close can be confirmed: from then a row also counts as a closing line when the book was still quoting the same price inside 300 seconds of the jump; before it, only a price change inside those 300 seconds counted, so a price that sat still for the last minutes reads as a last-seen close. One row per period: {period, from|to, rows, closing_rows, closing_pct, basis}. Added 2026-10-19.
  - `consensus_close_pct` number: Of the rows that are genuine closing lines (is_closing_line, not scratched), the share carrying consensus_close_prob — the market's margin-free probability stored at the close (columns from 2026-10-05, backfilled to the archive floor).
  - `finish_position_pct` number: Of the rows whose race has a result, excluding runners the result marked scratched, the share carrying a finish_position. Measured, not promised: AU thoroughbreds and greyhounds carry every finisher's position (from 2026-09-14), AU harness and NZ the full field from 2026-10-04 and the placegetters only before it.
  - `by_category` object[], required
  - `window_days` integer: Days the by_bookmaker rates and the two result-join gaps are measured over, ending now.
  - `window_from` string, nullable: Start of that window, UTC.
  - `by_bookmaker` object[]: One row per bookmaker over the window: {bookmaker_key, rows, closing_pct, baseline_pct}. closing_pct is the share of that book's rows with is_closing_line; baseline_pct the share with open_is_baseline. Books differ widely, so filter on the flags rather than trusting the aggregate.
  - `settleable_races_in_window` integer: AU and NZ archive races in the window that started at least 3 hours ago (the denominator of races_without_result).
  - `races_without_result` integer: Of settleable_races_in_window, races with no result row at all.
  - `races_result_unlinked` integer: Of races_without_result, races whose result exists under a different race_id (category, a start within two minutes and the venue's first word match). Added 2026-10-19.
  - `results_in_window` integer: AU and NZ results in the window that started at least 3 hours ago (the denominator of results_without_race).
  - `results_without_race` integer: Of results_in_window, results with no archive race (no closing line at any served book).
  - `definitions` object: One line per gap and rate above, saying exactly what is counted.

## 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)
