18+ Only  |  Gambling can be addictive — please gamble responsibly  |  Gambling Help: 1800 858 858  |  GambleAware

API reference / Racing

GET /v1/racing/acceptances

Full-day AU thoroughbred acceptance card: every meeting, race and runner

The day's complete AU thoroughbred card as Racing Australia publishes it — meeting, then race, then runners in saddlecloth order — with no dependency on any bookmaker having framed a market. Per runner: saddlecloth number, barrier, jockey, trainer, weight, `runner_ref` (Racing Australia's code from its latest read of the field; once race day's read has landed it is the code the results and archives carry for the race — RA issues a new code for the same horse each day), Last-10 figures, Hcp Rating, the trainer/raceentry codes, the `emergency` flag, and `scratched` plus a `scratching` block (RA's own scratch time, late flag, "(Eliminated)" marker and note) for a runner already off. Per race: official name, local start time, distance, the conditions line verbatim, class, prize total and per-place breakdown, bonus note, track name/type, field limit, and the counts. Per meeting: rail, track type, condition — as RA's raw `track_condition` and, parsed from it, `going` plus `going_rating`, the same pair /v1/racing/horses/form publishes — weather, penetrometer, its own `as_of`, `emergency_data`, `scratching_data` and `withheld_acceptance_data`. **Identity (since 2026-10-12).** Every runner carries `horse_ref`, `pe:<folded name>`: the HORSE, the same value on /v1/racing/form, /v1/racing/horses/form and /v1/racing/horses/runs, stable across dates and meetings. `runner_ref` is Racing Australia's code for THIS nomination and is new every time the horse is entered; join histories on `horse_ref`, never on `runner_ref`. **Fields-page extras (since 2026-09-29).** Every runner also carries what Racing Australia prints under the acceptance table for that horse, verbatim and never inferred: `age`, `sex`, `colour`, `sire`, `dam` (without the dam's sire), `breeder`, `owner` (RA's Owners line), `gear_changes` for this start ("Tongue Tie OFF FIRST TIME"), the apprentice `claim_kg` read off the jockey cell ("(a3/52kg)" -> 3; 0 is an apprentice who no longer claims), `probable_weight_kg` and `penalty_kg` from their own columns, and the horse's LAST START — the most recent dated start that is not a trial or jump-out: `last_start_date`, `last_start_position`, `last_start_jockey`, `last_start_weight_kg`, `last_start_barrier`, `last_start_winner` (the horse itself when it won) and `last_start_rating`, the "Rtg" RA prints on that start's line. Null where RA prints nothing; null on every row stored before 2026-09-29 until the meeting is re-read. MEASURED on the first pass that read them (2026-09-28 20:58Z, 10 meetings, 501 acceptances): pedigree/breeder/owner on 501 (100%), a last start on 423 (84%), a last-start Rtg on 261 (52%), a claim on 107, gear changes on 111. `last_start_rating` is NOT a substitute for `hcp_rating`: of the runners with no Hcp Rating, 5 carried a last-start Rtg on that pass (0 of 43 on the saved Moe card of 2026-09-08) — the unrated are overwhelmingly horses whose last start printed no Rtg either. **No prices, on purpose.** This is the entry list, not a market. It is available about two days out, which is the point of it — /v1/racing/next-to-go and /v1/racing/best-odds carry prices when books open, and this endpoint stays readable long before they do. **Scratched runners are flagged, never removed.** They keep their place in the card so it can be reconciled line-for-line against RA's official sheet. **`emergency` is true, false or null.** Null means the meeting was collected before emergency acceptances were recorded (2026-09-08 01:01:39 UTC) — its emergency acceptances are absent from the source table entirely, so "false" would be a fabrication. The meeting says which case it is in `emergency_data`: "parsed" or "unknown". **`scratched` is true, false or null too, for the same reason.** RA's scratching sheet does not exist for every date in the window — measured 2026-09-08, 2026-09-05 and 2026-09-06 have no scratching row at all while 09-07 has 96 and 09-08 has 77 — and each meeting's sheet is collected separately, so one meeting can be missing its sheet while its acceptances are present. A row from the sheet is the only positive evidence it was read, so each meeting publishes `scratching_data`: * `"parsed"` — the sheet was read for this meeting; `scratched` is a real boolean and the counts resting on it are real numbers. `scratching_sheet_as_of` says when. * `"unknown_date"` — no meeting on this date has a scratching row. No sheet exists for the day; `scratched` is null everywhere on it. * `"unknown_meeting"` — other meetings on this date have a sheet and this one does not: either nobody was scratched here or this meeting's fetch failed, and nothing on this card tells them apart, so `scratched` is null. Do not read a null as "not scratched", and do not read `scratching_data` other than "parsed" as "clean meeting". **The counts name their population.** An emergency acceptance runs only if it is PROMOTED and RA does not publish whether it was, so a count that mixes emergencies with declared runners overstates the field. Every level (race, meeting, day) carries: `runner_count` (rows held, scratched and emergencies included — a floor wherever `runner_set_status` is not "checks_passed"), `emergency_count`, `declared_count` (runner_count minus emergency_count), `scratched_count`, `unscratched_count` (runner_count minus scratched_count, a reconciliation figure that STILL includes emergencies), `declared_scratched_count`, and `declared_remaining_count` — the horses expected to jump barring a promotion, which is the number to render as the field. Worked example, Moe R1 on 2026-09-08: 17 acceptances, 5 emergencies (#1, #14-#17), 12 declared, 6 scratchings all of declared runners — 11 rows are unscratched but only 6 declared horses remain. Anything resting on an unknown fact is null, not a guess, and the day totals are null unless every meeting with rows knows the fact. With NO meeting on the card publishing acceptances there is nothing to total: runner_count is a real 0 and every other day count is null, matching what those meetings each report, and `counts_cover_every_published_meeting` is false. **On a race that is not "checks_passed", every count is a FLOOR.** All seven are computed over the acceptance rows this card HOLDS, and such a race is one the card has itself declared short. Two of them looked exact and were not. `scratched_count` and `declared_scratched_count` count sheet rows MATCHED to an acceptance row, so a scratching with no row here is in `missing_runners` and not in the count: Townsville R6 on 2026-09-08 reads `scratching_data: "parsed"`, `scratched_count: 0`, while RA's sheet lists #4 Five Star King and #9 Kickoff — at least 2. And `declared_remaining_count` is the number to render as the field ONLY on a "checks_passed" race: Townsville R5 that day is "gap_detected" with saddlecloth #6 unaccounted for and NOT on the sheet — a horse that may well be jumping — so its 11 is "at least 11", never an exact field. Each such race's `runner_set_note` states the bound explicitly. **Completeness is cross-checked, and the note says what was OBSERVED.** ra_race_fields is keyed (meeting_date_aet, runner_key) without a race number, so a horse accepted in two races on one Sydney day has ONE slot — and since 2026-09-08 the acceptance pass gives that slot to NEITHER race rather than publish one race's barrier and weight against the other race's runner: the horse appears in neither race, not in one of them. **Do not de-duplicate by `runner_key` to recover them — there is nothing to de-duplicate.** Read `missing_runners` instead: every withheld slot is named there, in its own race, with its REAL saddlecloth number, `source` `"withheld_acceptance"`, and a `cause_detail` naming the slot published in its place where one was. Each race is checked three ways — for saddlecloth holes, against the independently-keyed scratching sheet where one exists, and against the withheld slots recorded as withheld when the card was collected — then reports `runner_set_status` ("checks_passed", "gap_detected" or "unverified"), a `runner_set_note` and any `missing_runners`. Each missing runner carries the cause actually observed for it — `duplicate_runner_key` (the collision is visible, not assumed: the same runner_key is held elsewhere on this card, or the slot was recorded as withheld), `declared_preferred` (a declared acceptance elsewhere on the day won the key and this race's emergency slot was dropped — nothing collided, so do not hunt a second race), `eliminated_emergency` (RA's sheet marks it an emergency and no acceptance row exists) or `not_determinable` — plus a `cause_detail` naming the observation. The endpoint does not guess which of several indistinguishable causes applies. **The withheld check is the only one that can see a loss above the top of the numbering**, which is exactly where Racing Australia numbers its emergencies: drop #13e from a 1..14 field and 1..12 is perfectly contiguous. Measured 2026-09-10, that silence certified Warwick R2 and Bunbury R2 as "checks_passed" with `emergency_count` 0 while RA listed 14 and 13 entries against the 12 served each — false statements under a schema that calls `declared_remaining_count` exact on a checks_passed race. Each meeting publishes `withheld_acceptance_data`: `"parsed"` (this card placed this meeting's withheld rows, so its discards are accounted for below), `"unplaced"` (the pass recorded discards here and this card could NOT place a single one — the meeting's acceptance fields are unpublished, or the race the row names is not on this card; `withheld_acceptance_slots_unplaced` counts them and `completeness.withheld_acceptance_slots_unplaced` totals the card) or `"unknown"` (no row at all — either nothing was withheld, or the pass that read this meeting predates the record). A row is the only positive evidence, so do NOT read `"unknown"` as "nothing was lost"; `completeness.withheld_acceptances` says whether the whole date holds any record at all. Every `missing_runners` entry carries `withheld_acceptance` (true/false) — the provenance of the loss, and the field `completeness.withheld_acceptance_slots` counts. Read THAT, not `source`: one slot can be named by RA's scratching sheet AND recorded in ra_withheld_acceptances, and it is listed once, keeping the sheet's `source` (the sheet saw the scratching) while carrying the withheld cause and `withheld_acceptance: true`. A withheld slot whose horse this card already holds in that SAME race under another saddlecloth is not listed at all: RA renders one horse twice in one race under two saddlecloths, only one row can be published, and no runner is missing from the race. **A past-date card is a snapshot and will never complete.** `date_status` is "past", "today" or "future". Acceptances are collected for today and forward only, so on a PAST date: a meeting at `acceptances_published: false` will NEVER fill in (live on 2026-09-05: sportsbet bundaberg and sportsbet mareeba) — calling again cannot help, and the meeting's `publication_note` says so; and the scratchings are frozen at the last collection pass of that day, roughly midday race-day, with no later movement recoverable from anywhere, /v1/racing/changes included. On "today" or "future" the next collection pass CAN add both, every two hours — but that is not a promise that the card converges. Racing Australia stops listing a meeting once it is UNDERWAY, so a meeting's rows stop advancing around 12:15-14:15 AEST while its own races run on to 17:00-19:30. Log-verified 2026-09-09: the 02:15Z pass discovered all six of that day's meetings, the 04:15Z pass discovered one, the 06:15Z pass discovered none. The in-band signal is per meeting — its own `as_of` and `scratching_sheet_as_of`. A stamp that stops moving while later passes land on other meetings is a meeting that has gone underway, not a quiet one, and from that point `/v1/racing/changes` carries the race-day movement. **Why 2 credits.** A whole day is one request assembled from four reference tables: a midweek card is a few hundred runners over a handful of meetings and a Saturday well over a thousand across seventeen or more (measured: 372 runners / 4 meetings on Tuesday 2026-09-08; 1,259 / 17 on Saturday 2026-09-05). That is materially more than /v1/racing/track-conditions (1 credit, tens of rows) and is priced level with /v1/racing/next-to-go; it does no cross-book price assembly, so it is not a 3. The underlying data only updates every two hours — calling this once or twice a day is the intended shape, not polling it. **Coverage, honestly.** Australian THOROUGHBRED meetings only. Racing Australia publishes no acceptance card for greyhounds or harness, and none for New Zealand, so those meetings are absent here — not empty, absent. History is kept from 2026-09-29 on: until then the reference tables were deleted three days after each meeting, so the store begins at the oldest day that survived (2026-09-26) and grows by a day each day. `coverage_from` is that first day, read from the tables on every call; any `date` from it up to three days ahead is served, and an earlier one is a free 422 naming the floor rather than a truthful-looking empty card. A past day is the card as the LAST read of that day left it — see the past-date paragraph above. **How current it is.** `as_of` is the newest RA read backing the meetings actually returned (a venue filter narrows it, so one stale meeting cannot borrow another's freshness), and each meeting carries its own plus `scratching_sheet_as_of`. A malformed or out-of-window `date`, and an unknown query parameter, are both a free 422 — nothing is charged.

Requires X-API-Key 2 credits

Request

curl 'https://api.puntersedge.online/v1/racing/acceptances' \
  -H 'X-API-Key: YOUR_KEY'

Parameters

NameIn TypeRequired Description
date query string no Meeting day, Australia/Sydney, YYYY-MM-DD. Defaults to today. Any day from the store's first day (`coverage_from` in the response; an earlier date is a free 422 naming it) up to 3 days ahead.
venue query string no One meeting, case-insensitive ('Moe', 'sandown hillside'). Omit for every meeting on the day.

Responses

Status codes: 200, 401, 402, 422, 429, 500. Response bodies are JSON; the full schema is in /openapi.json.

Example response

200 application/json — this call costs 2 credits. Field names and types are as the API returns them; values are a real sample, trimmed to a few items.

{
  "date": "2026-09-29",
  "date_status": "today",
  "meeting_count": 1,
  "race_count": 8,
  "runner_count": 97,
  "emergency_count": 1,
  "declared_count": 96,
  "scratched_count": 16,
  "unscratched_count": 81,
  "declared_scratched_count": 15,
  "declared_remaining_count": 81,
  "as_of": "2026-09-29T02:16:17.177959Z",
  "coverage_from": "2026-09-26",
  "completeness": {
    "races_checks_passed": 8,
    "races_gap_detected": 0,
    "races_unverified": 0,
    "known_missing_runners": 0,
    "meetings_acceptances_unpublished": 0,
    "meetings_emergency_data_unknown": 0,
    "meetings_scratching_data_unknown": 0,
    "meetings_scratching_sheet_absent_for_whole_date": 0,
    "runners_without_emergency_data": 0,
    "runners_without_scratching_data": 0,
    "withheld_acceptances": "unknown_date",
    "meetings_withheld_acceptance_data_unknown": 1,
    "withheld_acceptance_slots": 0,
    "withheld_acceptance_slots_unplaced": 0,
    "counts_cover_every_published_meeting": true
  },
  "meetings": [
    {
      "venue": "Grafton",
      "venue_norm": "grafton",
      "venue_id": "grafton",
      "venue_site": "grafton",
      "acceptances_published": true,
      "publication_note": null,
      "race_count": 8,
      "runner_count": 97,
      "emergency_count": 1,
      "declared_count": 96,
      "scratched_count": 16,
      "unscratched_count": 81,
      "declared_scratched_count": 15,
      "declared_remaining_count": 81,
      "emergency_data": "parsed",
      "scratching_data": "parsed",
      "withheld_acceptance_data": "unknown",
      "withheld_acceptance_slots_unplaced": 0,
      "scratching_sheet_as_of": "2026-09-29T02:16:17.177959Z",
      "runner_set_status": "checks_passed",
      "as_of": "2026-09-29T02:16:17.177959Z",
      "track": {
        "rail": "+3m entire",
        "track_type": "Turf",
        "track_condition": "Soft 5",
        "going": "Soft",
        "going_rating": 5,
        "weather": "Fine",
        "penetrometer": null,
        "track_info": null,
        "dual_track": "N"
      },
      "races": [
        {
          "race_number": 4,
          "race_id": "f182ecf5-f978-4941-a385-1b02db4bcfe4",
          "race_name": "CRJC CHRISTMAS RACE DAY 29 NOVEMBER COUNTRY BOOSTED BENCHMARK 66 HANDICAP",
          "start_time_local": "2:45PM",
          "distance_m": 1106,
          "race_class": "BenchMark 66",
          "conditions": "BenchMark 66, Handicap, Minimum Weight 55kg, Apprentices can claim.",
          "prize_total": 30000,
          "prize_breakdown": {
            "1st": 15000,
            "2nd": 5300,
            "3rd": 2800,
            "4th": 1475,
            "5th": 975,
            "6th": 800,
            "7th": 725,
            "8th": 725,
            "9th": 725,
            "10th": 725
          },
          "bonus_note": "BOBS Silver Bonus Available Up To $9625",
          "track_name": "Main",
          "track_type": "Turf",
          "field_limit": "14 + 6 EM",
          "runner_count": 10,
          "emergency_count": 0,
          "declared_count": 10,
          "scratched_count": 0,
          "unscratched_count": 10,
          "declared_scratched_count": 0,
          "declared_remaining_count": 10,
          "runner_set_status": "checks_passed",
          "runner_set_note": null,
          "missing_runners": [],
          "runners": [
            {
              "number": 2,
              "barrier": 9,
              "runner_name": "Geegee Jet By",
              "runner_key": "geegeejetby",
              "horse_ref": "pe:geegeejetby",
              "runner_ref": "ra:NDE3ODM4NjM5ODQ",
              "jockey": "Grady Spokes",
              "trainer": "Brett Dodson",
              "weight_kg": 61.0,
              "last10": "30581175x0",
              "hcp_rating": 66,
              "trainer_code": "MTA3Mjc2ODAw",
              "raceentry_code": "MTI0NzkwNTUwMDY0",
              "emergency": false,
              "scratched": false,
              "scratching": null,
              "claim_kg": 1.5,
              "probable_weight_kg": 59.5,
              "penalty_kg": null,
              "age": 7,
              "sex": "gelding",
              "colour": "brown",
              "sire": "Wordsmith",
              "dam": "Geegee Pretty Jess",
              "breeder": "P A & E J Geard",
              "owner": "D J Dick, T M Booth, K J Twohill, J L Haimes, G J Monaghan, Sea Eels (Mgr: G M Wyborn), S D Monaghan, P G Sinclair, D R MacKenzie, N Gibbons & A C Durrington",
              "gear_changes": "Synthetic Hoof Filler OFF FIRST TIME",
              "last_start_date": "2026-09-06",
              "last_start_position": 11,
              "last_start_rating": 66,
              "last_start_jockey": "Archie McColm",
              "last_start_weight_kg": 55.0,
              "last_start_barrier": 13,
              "last_start_winner": "Speck"
            },
            {
              "number": 1,
              "barrier": 6,
              "runner_name": "Dune And Dusted",
              "runner_key": "duneanddusted",
              "horse_ref": "pe:duneanddusted",
              "runner_ref": "ra:NDE5MTM2NTMxMzY",
              "jockey": "Nathan Thomas",
              "trainer": "Paddy Cunningham",
              "weight_kg": 61.5,
              "last10": "60x6094082",
              "hcp_rating": 67,
              "trainer_code": "MTQ1NzE1MDI0",
              "raceentry_code": "MTI0Nzk1Mzg1NDA4",
              "emergency": false,
              "scratched": false,
              "scratching": null,
              "claim_kg": null,
              "probable_weight_kg": null,
              "penalty_kg": null,
              "age": 7,
              "sex": "gelding",
              "colour": "bay",
              "sire": "Hidden Dragon",
              "dam": "Miss Caitlyn",
              "breeder": "Mr P J Cunningham",
              "owner": "P J Cunningham & Mrs K A Cunningham",
              "gear_changes": null,
              "last_start_date": "2026-09-20",
              "last_start_position": 2,
              "last_start_rating": 67,
              "last_start_jockey": "Jenny Duggan",
              "last_start_weight_kg": 61.5,
              "last_start_barrier": 8,
              "last_start_winner": "Soobooco"
            }
          ]
        }
      ]
    }
  ],
  "note": "Australian thoroughbred acceptances from Racing Australia, re-read every two hours and typically published about two days ahead. No prices: this is the entry list, not a market. …"
}

Guides that use this endpoint

Related endpoints

Try it against live data

The free tier needs no credit card, and the sandbox endpoints need no key at all.

Get a free API key Quickstart
This site contains wagering-related analysis and is intended for Australian users aged 18+. Gambling involves risk. Please gamble responsibly.