Live horse-racing win odds across nine countries (Japan, France, UK, Ireland, USA, Australia, Germany, South Africa, New Zealand), with 19 source-side filters (country, racecourse, discipline, distance, going, odds...). Flags implied-probability steamers and drifters between runs.
0.3.0 — Source filters on every market + race context columns (23/09/2026)
Added
19 optional filters, applied at source so excluded races are never
fetched nor billed: countries, meetings, disciplines, categories,
surfaces, going, age_conditions, sex_conditions, track_directions,
min/max_distance_m, min/max_prize_eur, min/max_runners,
start_after/start_before (+ filter_timezone), horse-level
min/max_odds. Same engine and inputs as Horse Racing Pulse.
One vocabulary across nine markets: UK "3YO plus", AU "3Up" and PMU
"TROIS_ANS_ET_PLUS" match the same age filter; "Group 1"/"Grade 1"/"G1" =
GROUPE_I; miles/furlongs converted to metres; prizes converted to EUR
(approximate fixed rates). The README lists which market publishes what.
With a countries filter, only the sources that can hold those countries
are called.
Race context on every row: discipline, category, distance_m,
prize_eur, runners, surface, going, age_condition,
sex_condition, track_direction, post_epoch_ms.
Fixed
French market: the distance column held the discipline (PLAT/ATTELE)
instead of the distance.
French market: every PMU race was labelled FR, including the foreign
tracks PMU takes bets on (Kempton, Happy Valley, Solvalla…) — each race now
carries its real country.
French market: the PMU programme date was computed in UTC, so between
midnight and 2 am Paris time the actor read yesterday's card.
UK/IE/US: race times used a fixed UTC+1 — an hour off all winter, which also
shifted the "already off" cut. Now real Europe/London time. Australian
display times now follow AEST/AEDT instead of a fixed +10.
0.2.8 — Relative movement rule (09/09/2026)
Added
Outsider steamers are now caught. The signal used to fire only on an
absolute move of movement_threshold_pct implied-probability points, which
is blind to the classic outsider steam: 50/1 → 20/1 is only +3 points but
+150 %. A second rule now fires when the implied probability moves by at
least movement_relative_pct (default 30 %) of its previous value; moves
on 200/1+ shots are ignored as noise. Signal rows carry trigger
(absolute | relative) and relative_change_pct. Set
movement_relative_pct: 0 to keep the old behaviour.
0.2.7 — Cold review (09/09/2026)
Fixed
The steamer was the row max_results cut. Snapshots were emitted
first; with the default cap (15) and up to nine markets × 15 races, a run
with one genuine steamer delivered 15 snapshots and no signal. Signals now
come first.
A market whose source failed lost its whole odds history for the next
run — with nine sources, one of them failing on a given run is common, and
every such run reset that market's baseline to zero. Horses not seen this
run are now carried forward for 12 h.
Changed
History entries carry a seen_at timestamp; the pre-upgrade flat layout
is still read for one run.
0.2.0 — 2026-08-28
Reliability fix — every run now returns a result.
Racing has long dead windows (overnight, between meetings, off-season per
country) where no race has open win odds yet, and on a quiet run nothing
moves. Previously the Actor pushed nothing in those cases, which made the
run look like a failure. It now returns a single lightweight status row
with a clear message ("No upcoming races with open win odds right now" or
"Scanned N races — no significant odds movement right now") so every
scheduled run comes back clean.
0.1.x — 2026-07 → 2026-08
Multi-market horse-racing odds movement (steamers & drifters): JP, FR, UK,
IE, US, AU, DE, ZA, NZ.
Hardened input parsing and history storage so a bad optional input or a
key-value store hiccup can no longer fail a run.