Horse Racing Pulse avatar

Horse Racing Pulse

Pricing

$2.00 / 1,000 results

Go to Apify Store
Horse Racing Pulse

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

0xGollum

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

2

Monthly active users

16 days

Issues response

10 hours ago

Last modified

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:
SignalMeaning
steamerA horse's implied probability jumped between runs — money coming in fast, price shortening
drifterA horse's implied probability faded between runs — confidence draining, price lengthening
  • Pattern (opt-in via include_form_history) — a named, hidden form signal:
PatternMeaning
debutantHorse's first-ever race — no form to go on
winless_streak10+ career starts, still 0 wins
jockey_changeJockey/driver changed for this race
earnings_swingThis 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)

FieldDefaultDescription
max_races20How many soonest-starting active races to scan per run (counted after filters)
movement_threshold_pct5Minimum implied-probability change (percentage points) between runs to fire a signal
movement_relative_pct30Also fire when the implied probability moves by this % of its previous value — catches outsiders steaming (50/1 → 20/1). 0 disables.
only_signalsfalseSkip snapshots, only push steamer/drifter/pattern rows
include_form_historyfalseAlso 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.

FilterExampleWhat 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_m1600 / 2400Race distance in metres
min_prize_eur / max_prize_eur30000Total prize money (€)
min_runners / max_runners10 / 16Declared 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_odds5 / 20Horse-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_results keeps 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_pct for more sensitivity (more signals, more noise) or raise it to only catch big moves.
  • Races close to post time move fastest — max_races is 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.