Takes the same arguments as get_race_card(), so a race you pulled form for
can be looked up here unchanged. Omit `race` to get the whole card in one
call instead of looping race numbers.
Each runner carries `outcome` ('placed', 'did_not_finish', 'scratched' or
'pending') plus `position` and `margin` when they apply — branch on
`outcome`, since `position` is omitted when it does not. Dead heats share a
position. Each race carries `resultStatus`: 'final', 'interim', 'pending' or
'abandoned'.
Results are scraped by a pipeline run every 2-3 hours, not streamed, so a
race that has just run reads 'pending' until the next run picks it up. That
is not an error — do not retry in a loop.
Coverage matches get_race_card(): every market we carry form for. Where no
racing body's results are scraped (US, Canada, Japan, France, ...) the result
comes from bookmaker results feeds and appears about two hours after the race,
with finishing positions but no margins.
Args:
date: Race date in YYYY-MM-DD format. Range: 30 days ago to 7 days ahead.
track: Track/venue name (e.g. 'flemington', 'randwick'). Case-insensitive.
race: Race number (1-20). Omit for every race at the meeting.
race_code: Race type — 'gallops' (default), 'harness', or 'greyhounds'.
country: Country code (e.g. 'au' default, 'nz', 'gb', 'us', 'jp').
timezone: IANA timezone for date interpretation (e.g. 'Europe/London').
Defaults to Australia/Sydney — set this for overseas racing so the
date matches the local race day.