Racing

What the results field coverage actually is

Cost: 1 credit. The results store's own measurement of its FULL-FIELD coverage, per Sydney day, category and venue — the aggregate answer to the question field_status answers per race on /v1/racing/results.

runners: null on its own can mean several different things: a fill pass that has not run yet (pending), a pass that has been and gone while the collector keeps re-attempting the row (overdue), a row past its collector's retry horizon so that no scheduled pass still selects it (unavailable), a racing code no collector exists for (unsupported — since 2026-10-04 only foreign races an AU book listed; AU harness and both NZ codes, 1,254 of the 5,577 stored results as at 2026-09-10, are collected from TAB New Zealand from that day), and a race that did not run (not_applicable). Counting them separately is what lets you decide between polling, reconciling and giving up, without paging the results themselves.

Every count comes from the same function that sets field_status on each race, applied to the rows in the window at request time, so this summary and the races it summarises can never disagree. Nothing holds a race in pending indefinitely: pending ends at the normal pass, overdue ends at the collector's own candidate horizon.

READ THE PERCENTAGES CAREFULLY. complete_pct and supported_complete_pct are NULL, not 0.0, when their denominator is 0 — an empty window, or one holding only codes we do not collect. A days=1 window is empty for the first hours of every Sydney day, and a monitor that treated a fabricated 0.0 as real coverage would page every night. collectable is published alongside them so 0-of-0 is never mistaken for 0-of-many.

Days are AUSTRALIAN EASTERN calendar days (Australia/Sydney), the same day a meeting is advertised under, and to_day is today in Sydney — a part day whose races are mostly still pending, which is normal and not a gap. Read by_day for the day-by-day picture and venues_incomplete for the venue-days that are genuinely short.

archive_races_without_result looks from the other side: AU and NZ races in the closing-line archive, in this window and at least three hours old, that have no result row at all (archive_races_in_window is its denominator). They are not in races, which counts stored results only. archive_races_result_unlinked is the part of that count whose result does exist under another race_id — reachable by venue, date and start time, not by race_id.

Two things the field states cannot say on their own: whether the RESULT is in (each category and day row carries result_final, independent of the field), and whether a late field is late because its source is refusing our collector (field_sources_refused, and overdue_source_refused on each row, a subset of overdue).

Sibling endpoint: /v1/racing/closing-lines/coverage does the same job for the price archive.

get/v1/racing/results/coverage

Request

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

Query parameters

daysinteger

Sydney days to count, ending with today (a part day).

Headers

X-API-Keystring
X-RapidAPI-Proxy-Secretstring

Response

Successful Response

as_ofstring required

When these counts were computed (UTC).

daysinteger required

How many Sydney days the window spans, ending today.

from_daystring required

First Sydney date counted (inclusive).

to_daystring required

Last Sydney date counted — today in Sydney, so it is a PART day and its races are mostly pending.

coverage_fromstring nullable

Start time of the earliest result retained anywhere in the store, the same value /v1/racing/results puts on every row. ONE GLOBAL VALUE: it is the oldest Australian card, and it is not when any other lane began — South African results, for instance, start months later. Read results_floors for the per-lane answer.

results_floorsobject[]

From when a RESULT exists at all, per country and category, MEASURED from the store rather than typed (2026-10-17): country, category, from (the date of the earliest stored result for that lane, the race's OWN date — so a Great Britain, Ireland or South Africa lane is named by its own card, not by the Sydney day it fell on; from_day and to_day above are Sydney days, which is a different question) and results (how many it holds). This is the figure to read before settling or scoring a lane. It is NOT coverage_from, which is one global value — the earliest result anywhere, currently an Australian card — and so says nothing about when a newer lane began. It is NOT field_floors either: that is when the FULL FIELD began, which can be later than the result. Australian thoroughbreds have results from 2026-08-15 and fields only from 2026-09-01, so neither value can be inferred from the other. A lane absent from this list has no result in the store at any date: races in it are priced and archived but cannot be settled here, which is true of every country outside Australia, New Zealand, Great Britain, Ireland and South Africa.

field_floorsobject[]

Machine-readable twin of field_scope (2026-10-15): one row per country and category that has a full-field collector — country, category, field_source (the machine value field_source carries on /v1/racing/results), source_name and from (the earliest Sydney card a stored field exists for, measured). Codes outside this list hold placegetters only.

racesinteger required

Every stored result in the window, all codes and all states. races == complete + pending + overdue + unavailable + unsupported + not_applicable, always.

completeinteger required

Races carrying a runners field.

pendinginteger required

A collector exists and the pass that normally fills the race has not been yet.

overdueinteger required

That pass has been and gone with no field written, but the collector still re-attempts the row. NOT a terminal state — see field_status on /v1/racing/results for the horizons.

unavailableinteger required

Past the collector's own retry horizon: no scheduled pass still selects the row.

unsupportedinteger required

No collector has ever existed for the code.

not_applicableinteger required

The race did not run (abandoned, postponed or transferred) and has no field — nothing to collect, not a gap.

collectableinteger required

races - unsupported - not_applicable: the races in this window that could carry a field at all. It is the denominator of supported_complete_pct, published so that a null percentage is readable as 0-of-0 rather than guessed at.

complete_pctnumber nullable

complete / races as a percentage, across the whole window including codes that can never carry a field. NULL — not 0.0 — when races is 0. An empty window has no coverage figure, and 0.0 there is a fabricated number that reads as total failure: a days=1 window called between Sydney midnight and the day's first result is empty on most days (the median first result of a Sydney day lands at 10:50 local), so this is an ordinary case and not a corner.

supported_complete_pctnumber nullable

complete / collectable: the figure to read if you only care about the codes we collect fields for. The raw complete_pct is dragged down by stored races in codes that had no collector before 2026-10-04 (AU harness and both NZ codes, 1,254 rows as at 2026-09-10). An AU harness result still carrying the 2026-09-29..10-04 pre-race board copy (origin: board) counts as complete AND collectable here, so on such a window separate them with by_category. NULL — not 0.0 — when collectable is 0, which happens on an empty window or one holding only foreign races. If you alert on this figure, treat null as 'no data' and never as 'zero coverage'.

by_categoryobject[] required

One row per country + category over the window: {country, category, field_source, races, complete, pending, overdue, unavailable, unsupported, not_applicable}, which sum to races, plus four keys added 2026-10-19 that are NOT part of that sum: result_final (races whose result is final — placings, and dividends where the book publishes them, are in; this is independent of the full field), overdue_source_refused (the part of overdue whose source is currently refusing our collector, see field_sources_refused), oldest_overdue_age_h (hours since the start of the oldest overdue race, null when none) and refused_since (UTC, set while this row's source refuses us). Since 2026-10-20 each row also carries result_completeness {provisional, final_placings, complete_full_field, not_run}, a separate partition that also sums to the row's races.

by_dayobject[] required

One row per Sydney day + country + category, newest first, with the same counts. This is the day-by-day answer to 'is yesterday finished yet'.

venues_incompleteobject[] required

Venue-days still missing a field in a code we DO collect: {day, venue, venue_id, category, country, settled} plus every counter above (races, complete, pending, overdue, unavailable, unsupported, not_applicable), which sum to races exactly. Ordered worst first: most unavailable, then the biggest outstanding shortfall, then oldest day. settled is true when nothing on that venue-day can still fill (no pending, no overdue) — that is the difference between a genuine terminal gap and a card simply still in progress, and without it a day mid-fill outranks a real one. A venue-day is listed when complete + not_applicable < races: an abandoned card has nothing to collect and is NOT a shortfall. A venue-day whose only gap is unsupported is deliberately absent — it would be most of the list and it is already counted above. Capped at 200 entries; venues_incomplete_truncated says when the cap bit.

venues_incomplete_truncatedboolean
field_scopestring required

Prose: which codes are collected, from when, and what the never-collected codes are.

archive_races_in_windowinteger

AU and NZ closing-line archive races that started in this window at least 3 hours ago.

archive_races_without_resultinteger

Of archive_races_in_window, races with no result row at all: a price history with nothing to settle it against. Not counted in races, which counts stored results only.

archive_races_result_unlinkedinteger nullable

Of archive_races_without_result, races for which a result DOES exist but under a different race_id (matched on category, a start within two minutes and the venue's first word — 'Mt Gambier' = 'Mount Gambier'). A join on race_id misses them; a join on venue, date and start time finds them. The rest of archive_races_without_result have no result at all — typically a race abandoned after it was priced, or a meeting the results feed never published. Added 2026-10-19; null when not computed.

result_completenessobject

Added 2026-10-20: the window's races by RESULT completeness — provisional, final_placings, complete_full_field, not_run, the completeness.state values on /v1/racing/results. A SECOND partition of the same races, alongside the field states: provisional + final_placings + complete_full_field + not_run == races, always, and every by_category and by_day row carries the same object summing to its own races. complete_full_field is final AND carrying a field, so it can be smaller than complete (which counts a field on any row).

field_sources_refusedobject[]

Full-field sources currently refusing our collector (2026-10-19): one row per source with field_source, source_name, http_status, refused_since (the first refused run of the current streak, UTC) and checked_at (the latest run). Races of that source whose fill fell inside the refusal stay overdue and then unavailable and say so in field_note; their placings and deductions are unaffected. Empty when every source is serving.

Example response

{
  "as_of": "2026-09-10T03:40:12Z",
  "by_category": [
    {
      "category": "greyhound",
      "complete": 220,
      "country": "AU",
      "field_source": "fasttrack",
      "not_applicable": 0,
      "overdue": 8,
      "pending": 6,
      "races": 742,
      "unavailable": 0,
      "unsupported": 508
    },
    {
      "category": "horse",
      "complete": 108,
      "country": "AU",
      "field_source": "racing_australia",
      "not_applicable": 0,
      "overdue": 21,
      "pending": 2,
      "races": 137,
      "unavailable": 6,
      "unsupported": 0
    },
    {
      "category": "harness",
      "complete": 0,
      "country": "AU",
      "not_applicable": 0,
      "overdue": 0,
      "pending": 0,
      "races": 131,
      "unavailable": 0,
      "unsupported": 131
    }
  ],
  "by_day": [
    {
      "category": "greyhound",
      "complete": 5,
      "country": "AU",
      "day": "2026-09-10",
      "field_source": "fasttrack",
      "not_applicable": 0,
      "overdue": 0,
      "pending": 1,
      "races": 19,
      "unavailable": 0,
      "unsupported": 13
    },
    {
      "category": "horse",
      "complete": 42,
      "country": "AU",
      "day": "2026-09-09",
      "field_source": "racing_australia",
      "not_applicable": 0,
      "overdue": 7,
      "pending": 0,
      "races": 49,
      "unavailable": 0,
      "unsupported": 0
    }
  ],
  "collectable": 879,
  "complete": 806,
  "complete_pct": 75.54,
  "coverage_from": "2026-08-15T05:53:00Z",
  "days": 7,
  "field_scope": "Full fields are collected for AU thoroughbred (Racing Australia, from the 2026-08-15 card, the first day of results) and AU greyhound (FastTrack for Victoria, the national results pages elsewhere, from 2026-09-13), NZ harness (TAB New Zealand, from the 2026-09-30 Sydney card), NZ thoroughbred (TAB New Zealand, from the 2026-09-30 card) and AU harness (TAB New Zealand, from the 2026-09-27 card). No pass reaches back beyond its own floor.",
  "from_day": "2026-09-04",
  "not_applicable": 0,
  "overdue": 52,
  "pending": 21,
  "races": 1067,
  "supported_complete_pct": 91.7,
  "to_day": "2026-09-10",
  "unavailable": 0,
  "unsupported": 188,
  "venues_incomplete": [
    {
      "category": "horse",
      "complete": 0,
      "country": "AU",
      "day": "2026-09-09",
      "not_applicable": 0,
      "overdue": 7,
      "pending": 0,
      "races": 7,
      "settled": false,
      "unavailable": 0,
      "unsupported": 0,
      "venue": "Randwick",
      "venue_id": "randwick"
    }
  ],
  "venues_incomplete_truncated": false
}

Changes

No recorded changes to this operation across all 1 revision of this API.