Racing

Every runner in one race with its recent runs, from our own results

Cost: 3 credits. Every runner in one race with its recent runs from our own settled AU thoroughbred results, in one call: the field's form, not one horse's.

Naming the race. race_id from /v1/racing/next-to-go, /events, /acceptances or /results is exact. Failing that, venue + meeting_date (the AET meeting date) + race_number. Only thoroughbred races are matched, so a track that races gallops beside dogs or trots on the same day is not ambiguous (from 13 October 2026); two thoroughbred races sharing those three answer 409 race_ambiguous and cost nothing. A race a bookmaker has not framed yet has no race_id (every AU book frames a race 16 hours before its jump), so the evening before a meeting name it by venue + meeting_date + race_number exactly as /v1/racing/acceptances lists it: the answer comes from Racing Australia's acceptance card (card_source: acceptances, race_id null), and the whole of tomorrow's card can be read the night before.

The field. While the race is open the runners come from the live card (card_source: live): saddlecloth, barrier, jockey, trainer and allotted weight as the books and Racing Australia's acceptances publish them, with a horse the card has since scratched kept in the field and marked scratched: true. Once the race has been run and the live card purged, the field is the settled result's (card_source: results). Until then Racing Australia's acceptance card is folded in (acceptances_folded): every accepted runner, emergencies aside, is in the field even before the books list it, named as RA names it, with RA's last10 and last_start_date.

The runs. Under each runner, its newest runs runs (default 10, at most 20) out of the same store /v1/racing/horses/runs reads -- our own collected results plus the history collected behind them -- and a starts, wins and places summary over every run held. Each run carries date, venue, race, distance, class, track condition, saddlecloth, barrier, position, margin, official SP, weight, jockey, trainer and field size, and since 29 September 2026 the race's winning time and last-600m time, its total prize money and the place money this runner won (the winner's time_s is the race time; RA publishes no other runner's time). ONLY RUNS BEFORE THIS RACE'S START are included (form_as_at), so a race already run answers with what was knowable at the jump and never with its own result. A runner with no run held is still in the field, with runs: [] and runs_total: 0; source.coverage_from is the floor of the store, and nothing earlier exists here. runs_total counts STARTS (status: ran), the same figure as stats.starts, and held_rows_total counts every held row, scratchings included, which is what runs is drawn from: a horse scratched before its debut reads runs_total: 0 with its scratchings in runs. Before 2026-10-13 runs_total counted the scratchings too.

Identity. Runners are gathered on horse_ref (pe:<name>), the fold every thoroughbred surface publishes. runner_ref is the Racing Australia code the card carries for this runner, on race day the join to /v1/racing/next-to-go, /v1/racing/acceptances and /v1/racing/results; it is not a horse identity, because Racing Australia issues a new code for the same horse each day.

British and Irish races (from 2026-10-12). The same call answers a GB or IE thoroughbred race. The field is the UK bookmakers' card as we hold it -- William Hill's and Betway's rows carry the stall draw (barrier), rider, trainer, weight in kg, the form figures (last10), the horse's age and, from William Hill, the Racing Post rating -- and, once run, Betway's settled result. No acceptance card exists for these races, so acceptances_folded is always false. The runs are our own GB/IE results from Betway's settlement feed since 6 October 2026: position, SP and field size, no times or prize money, and a starter Betway never ranked once the result was final reads abnormal: did not finish; source.region reads GB-IE, source.coverage_from is that floor, and most horses hold few or no runs yet -- the record grows with every meeting we settle. meeting_date and each run's date are the London calendar date, and when you name a GB/IE race by venue + meeting_date + race_number, meeting_date is the London date and the course is matched by words ("Kempton" finds "Kempton Park").

Not a career record: this is what we hold, honestly bounded, and it grows with every meeting we collect. For Racing Australia's own form page (career splits, sectionals, price paths) use /v1/racing/horses/form, one horse at a time. A race we cannot find is a free 404, a race we hold no field for a free 404, an unknown query parameter a free 422. Thoroughbreds only; greyhounds have /v1/racing/greyhounds/form. Cached 10 minutes; the AU store refreshes hourly, the GB/IE runs are read live.

get/v1/racing/form

Request

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

Query parameters

race_idstring nullable

The race_id from /v1/racing/next-to-go, /events, /acceptances or /results. The primary form; use venue + meeting_date + race_number only when you do not hold it.

venuestring nullable

Venue name as the feeds spell it (case-insensitive). Needs meeting_date and race_number.

meeting_datestring date nullable

AET meeting date, YYYY-MM-DD.

race_numberinteger nullable
runsinteger

Most recent runs to return per runner. The stats cover every held run regardless.

Headers

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

Response

Successful Response

race_idstring nullable

Our race_id. Null on an acceptance-only answer (card_source: acceptances): the race is on Racing Australia's card but no bookmaker has framed it yet, and every AU book frames a race 16 hours before its jump.

venuestring nullable
race_numberinteger nullable
start_timestring nullable

Scheduled start, UTC. Null on an acceptance-only answer; see start_time_local.

start_time_localstring nullable

Racing Australia's published start on the venue's own clock ('1:35PM'). Set on an acceptance-only answer.

meeting_datestring nullable

Sydney calendar date of the meeting; the London date for a British or Irish race.

race_namestring nullable
distance_minteger nullable
track_conditionstring nullable

As the live card or the result carries it.

race_statusstring nullable

The live race's status while it is open; the result's (interim/final) once it has been run.

card_sourcestring required

live -- the field came from the live card; results -- the race has been run, its live rows are gone, and the field is the settled result's; acceptances -- no bookmaker has framed the race yet (or no live field is held), and the field is Racing Australia's acceptance card.

acceptances_foldedboolean

True when Racing Australia's acceptance card for this race was found and folded in: every accepted runner (emergencies aside) is in runners, named as RA names it.

form_as_atstring nullable

This race's start, UTC. Every run and every figure below is from BEFORE this instant, so a race already run answers with what was knowable at the jump and never with its own result. On an acceptance-only answer, Sydney midnight opening the meeting day.

runs_per_runnerinteger required

The runs limit this answer was built with.

runners_totalinteger required
runners_with_runsinteger required

Runners with at least one start held (runs_total of 1 or more). A runner whose only held rows are scratchings is not counted.

Example response

{
  "acceptances_folded": true,
  "card_source": "live",
  "distance_m": 1300,
  "form_as_at": "2026-09-26T03:35:00Z",
  "meeting_date": "2026-09-26",
  "race_id": "1530bcdc-1cc9-4c97-816a-4423b663f788",
  "race_name": "Mdn Plate",
  "race_number": 4,
  "race_status": "open",
  "runners": [
    {
      "barrier": 7,
      "held_rows_total": 1,
      "horse_ref": "pe:pleasemizter",
      "jockey": "Jason Li",
      "last10": "1",
      "last_start_date": "2026-09-12",
      "name": "Please Mizter",
      "number": 3,
      "runner_ref": "ra:MjgwNjM0ODg2NDA",
      "runs": [
        {
          "box": 13,
          "date": "2026-09-20",
          "dead_heat": false,
          "distance_m": 1300,
          "field_size": 12,
          "horse_ref": "pe:pleasemizter",
          "jockey": "Jason Li",
          "last_600m_s": 34.61,
          "margin": "0.75L",
          "number": 14,
          "origin": "results",
          "position": 1,
          "prize_total": 50000,
          "prize_won": 27500,
          "race_class": "Maiden",
          "race_name": "Mdn Plate",
          "race_number": 4,
          "race_time_s": 77.12,
          "result_id": "res_9f1c…",
          "runner_ref": "ra:MjgwNjM0ODg2NDA",
          "sp": 7.5,
          "start_time": "2026-09-20T03:35:00Z",
          "status": "ran",
          "time_s": 77.12,
          "track_condition": "Good 4",
          "trainer": "Peter Fernie",
          "venue": "Rosehill",
          "weight_kg": 57
        }
      ],
      "runs_total": 1,
      "scratched": false,
      "stats": {
        "place_pct": 100,
        "places": 1,
        "starts": 1,
        "win_pct": 100,
        "wins": 1
      },
      "trainer": "Peter Fernie",
      "weight_kg": 57
    }
  ],
  "runners_total": 1,
  "runners_with_runs": 1,
  "runs_per_runner": 10,
  "source": {
    "collectors": [
      "racing_australia",
      "tabtouch"
    ],
    "coverage_from": "2026-09-01",
    "coverage_to": "2026-09-20",
    "feed": "puntersedge",
    "refreshed_hourly": true,
    "region": "AU",
    "sport": "thoroughbred"
  },
  "start_time": "2026-09-26T03:35:00Z",
  "track_condition": "Good 4",
  "venue": "Rosehill"
}

Changes

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