Horse Racing Pulse
Pricing
$2.00 / 1,000 results
Horse Racing Pulse
Live PMU horse-racing odds (French tracks plus foreign tracks PMU takes bets on) for races still open to betting, with 19 source-side filters (country, racecourse, discipline, distance, going, odds...). Flags implied-probability steamers and drifters between runs.
Pricing
$2.00 / 1,000 results
Rating
0.0
(0)
Developer
0xGollum
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
2
Monthly active users
16 days
Issues response
10 hours ago
Last modified
Categories
Share
Horse Racing Pulse 🐎
A shortening price is one of the oldest tells in racing. Catch it before the off.
Pari-mutuel odds aren't fixed by a bookmaker — they float with the betting pool right up to post time. When real money (often smart money) lands on a horse, its price shortens fast. This actor watches that movement across every PMU race still open for betting, continuously.
What a row looks like
A fired signal, straight from the dataset:
{"type": "signal","signal": "steamer","hippodrome": "CHANTILLY","race_name": "LE ROI SOLEIL","horse_num": 4,"horse_name": "INGEBORG","prob_change_pct": 6.8,"current_cote": 5.2,"current_prob_pct": 19.2,"previous_prob_pct": 12.4,"message": "INGEBORG (#4) at CHANTILLY R1C8: odds shortened to 5.2 (12.4% -> 19.2% implied) — money coming in fast."}
Every run also returns a snapshot row per horse per race (current odds + implied probability), and — with include_form_history on — pattern rows for hidden form tells. Full field list under Output below.
🆕 New: hidden form patterns (opt-in)
Odds movement tells you where the money is going right now. A horse's history tells you things a human would need to cross-reference by hand to notice — a jockey switch on the day, a horse still winless after a double-digit number of starts, earnings swinging sharply year over year. Turn on include_form_history and the actor now flags these automatically, alongside the odds signals. Off by default — nothing changes for existing users unless you opt in.
What you get
Three row types:
- Snapshot — current odds + implied probability for every horse in every tracked race
- Signal — a named, fired condition on odds movement:
| Signal | Meaning |
|---|---|
steamer | A horse's implied probability jumped between runs — money coming in fast, price shortening |
drifter | A horse's implied probability faded between runs — confidence draining, price lengthening |
- Pattern (opt-in via
include_form_history) — a named, hidden form signal:
| Pattern | Meaning |
|---|---|
debutant | Horse's first-ever race — no form to go on |
winless_streak | 10+ career starts, still 0 wins |
jockey_change | Jockey/driver changed for this race |
earnings_swing | This year's earnings vs last year's swung 50%+ in either direction |
Sources (public, no API key, no proxy)
PMU (Pari Mutuel Urbain) — France's official pari-mutuel operator, exposes a fully public, key-less JSON API used by its own web and app clients. Covers French tracks (flat, trot, jump) plus a handful of foreign tracks PMU takes bets on. No account, no login, no proxy needed.
Only races still open for betting are scanned (PROGRAMMEE, ROUGE_AUX_PARTANTS, DEPART_DANS_TROIS_MINUTES status) — finished races are skipped automatically, so every run's actionable.
Use cases
- Punters — spot steamers before the crowd, avoid drifters
- Value bettors — price movement is a core tell for market confidence shifts
- Content & tipster sites — power previews with live movement data
- Bots & automations — feed clean signals into your own alerting pipeline
Input (all optional)
| Field | Default | Description |
|---|---|---|
max_races | 20 | How many soonest-starting active races to scan per run (counted after filters) |
movement_threshold_pct | 5 | Minimum implied-probability change (percentage points) between runs to fire a signal |
movement_relative_pct | 30 | Also fire when the implied probability moves by this % of its previous value — catches outsiders steaming (50/1 → 20/1). 0 disables. |
only_signals | false | Skip snapshots, only push steamer/drifter/pattern rows |
include_form_history | false | Also flag hidden form patterns per horse (see above) |
🔎 Filters — only pay for the races you want
Every filter is optional and applied at source, before max_races: excluded races are never fetched nor billed. Text filters are case- and accent-insensitive; lists also accept a comma-separated string ("FRA, GBR"). A race whose value is unknown for an active filter is excluded.
| Filter | Example | What it keeps |
|---|---|---|
countries | ["FRA"] | PMU 3-letter country codes: FRA, GBR, IRL, SWE, ESP, HKG, USA… (PMU also takes bets on foreign tracks) |
meetings | ["CHANTILLY", "LONGCHAMP"] | Racecourses — partial match (LONGCHAMP finds PARISLONGCHAMP) |
disciplines | ["PLAT"] | PLAT, ATTELE, MONTE, HAIE, STEEPLECHASE, CROSS (English accepted: FLAT, TROT, HURDLE, CHASE) |
categories | ["HANDICAP"] | HANDICAP (all variants), COURSE_A_CONDITIONS, A_RECLAMER, GROUPE_I/II/III, AMATEURS, APPRENTIS, AUTOSTART, EUROPEENNE, NATIONALE… — GROUPE_I does not match GROUPE_II |
surfaces | ["HERBE"] | HERBE (turf), PSF (all-weather), SABLE, POUZZOLANE |
going | ["Bon", "Bon souple"] | Official going label: Bon, Bon souple, Souple, Très souple, Lourd, Léger, PSF RAPIDE… |
age_conditions | ["TROIS_ANS"] | DEUX_ANS, TROIS_ANS, TROIS_ANS_ET_PLUS, QUATRE_ANS_ET_PLUS… (exact) |
sex_conditions | ["FEMELLES"] | TOUS_CHEVAUX, FEMELLES, MALES, MALES_ET_HONGRES, FEMELLES_ET_MALES |
track_directions | ["CORDE_GAUCHE"] | CORDE_DROITE (right-handed), CORDE_GAUCHE (left-handed), LIGNE_DROITE |
min_distance_m / max_distance_m | 1600 / 2400 | Race distance in metres |
min_prize_eur / max_prize_eur | 30000 | Total prize money (€) |
min_runners / max_runners | 10 / 16 | Declared runners |
start_after / start_before | "13:30" / "18:00" | Start-time window (a window across midnight works) |
filter_timezone | "Europe/Paris" | Timezone for the start-time window (default Paris) |
min_odds / max_odds | 5 / 20 | Horse-level: only horses currently in this decimal-odds range |
Examples
French flat handicaps with big fields, no short favourites:
{ "countries": ["FRA"], "disciplines": ["PLAT"], "categories": ["HANDICAP"], "min_runners": 12, "min_odds": 4 }
Vincennes trot, afternoon only:
{ "meetings": ["VINCENNES"], "disciplines": ["ATTELE"], "start_after": "13:00", "start_before": "18:00" }
Every row also carries the race context as columns: discipline, category, distance_m, prize_eur, runners, surface, going, age_condition, sex_condition, track_direction.
Output
{"type": "signal","signal": "steamer","hippodrome": "CHANTILLY","num_reunion": 1,"num_course": 8,"race_name": "LE ROI SOLEIL","discipline": "PLAT","category": "HANDICAP_DIVISE","distance_m": 1600,"prize_eur": 28800,"runners": 16,"surface": "HERBE","going": "Bon","horse_num": 4,"horse_name": "INGEBORG","prob_change_pct": 6.8,"current_cote": 5.2,"current_prob_pct": 19.2,"previous_prob_pct": 12.4,"message": "INGEBORG (#4) at CHANTILLY R1C8: odds shortened to 5.2 (12.4% -> 19.2% implied) — money coming in fast."}
With include_form_history: true, you also get rows like:
{"type": "pattern","pattern": "earnings_swing","hippodrome": "VINCENNES","num_reunion": 1,"num_course": 3,"race_name": "PRIX D'AUTOMNE","horse_num": 5,"horse_name": "MAIS OUI MADRIK","direction": "up","swing_pct": 5568.0,"message": "MAIS OUI MADRIK (#5): earnings up 5568% vs last year (€510 -> €28905)."}
Reliability notes
- Signals and form patterns are always emitted before snapshots, so a tight
max_resultskeeps what matters. - Odds history is kept per French racing day: a horse is only compared with its own earlier odds today, never with whatever ran in the same slot yesterday.
- A race whose PMU call fails on one run keeps its odds baseline for the next.
Pricing
Pay per result: $0.002 per row (snapshots + signals + patterns).
Tips
- Schedule it every 10–15 min during racing hours to catch steam as it builds toward post time; movement between two runs is what triggers a signal, so it needs a persistent schedule (not one-off runs) to be useful.
- Lower
movement_threshold_pctfor more sensitivity (more signals, more noise) or raise it to only catch big moves. - Races close to post time move fastest —
max_racesis sorted soonest-first by default.
⚠️ Not betting advice. Odds movement reflects market activity, not a guaranteed outcome. This actor surfaces public odds data — it does not place bets or guarantee profit.