HKJC Odds Steamers & Drifters avatar

HKJC Odds Steamers & Drifters

Pricing

from $10.00 / 1,000 odds checks

Go to Apify Store
HKJC Odds Steamers & Drifters

HKJC Odds Steamers & Drifters

Tracks real-time Hong Kong Jockey Club (HKJC) horse racing odds movements. Compares current Win and Place odds against persisted snapshots to flag Steamers (shortening odds) and Drifters (lengthening odds).

Pricing

from $10.00 / 1,000 odds checks

Rating

0.0

(0)

Developer

Alex Wong

Alex Wong

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Categories

Share

Track real-time odds movements for Hong Kong Jockey Club (HKJC) horse races and automatically spot Steamers (odds getting shorter) and Drifters (odds getting longer).


What this actor does

The actor watches the live WIN odds for a single race. On each run it:

  1. Finds the current HKJC race meeting.
  2. Selects the race you want to watch.
  3. Fetches the latest race card and WIN/PLACE odds.
  4. Compares the current odds with the odds it saved on a previous run.
  5. Classifies every horse as a STEAMER, DRIFTER, or NEUTRAL.
  6. Saves the results to a dataset and, if you want, sends alerts to a webhook.

It is designed to be run repeatedly — for example every minute — so you can see how odds move over time.

What are Steamers and Drifters?

  • STEAMER — odds have shortened. The market thinks the horse is more likely to win. By default the actor flags this when WIN odds drop by 15% or more.
  • DRIFTER — odds have lengthened. The market thinks the horse is less likely to win. By default the actor flags this when WIN odds rise by 20% or more.
  • NEUTRAL — odds have not moved enough to trigger either threshold.

When to use this actor

  • You want to monitor odds movements during live HKJC betting.
  • You want an automated alert when a horse becomes a steamer or drifter.
  • You want to collect structured odds data into an Apify dataset for further analysis.

Before you start

This actor works best when it is scheduled to run repeatedly. A single run only tells you the current odds. To see movement, the actor needs at least two snapshots to compare.

  • The first run saves a baseline snapshot and exits.
  • The second run compares the latest odds against that snapshot and writes dataset records.
  • Every run after that updates the snapshot and keeps producing movement records.

If you only run it once, you will not see any signal, odds_delta_pct, or dataset output.


How to set the input parameters

When you run the actor on Apify, you fill in a simple form. Here is what each field means and how to choose a value.

ParameterWhat it doesRecommended setting
VenueFree-text race venue. Use ST for Sha Tin, HV for Happy Valley, or any HKJC venue code such as S1, S2, S3, H1. Use AUTO to let the actor pick the active meeting.Use AUTO unless you know the exact code.
Race NumberThe race you want to watch (1–11). Leave empty to let the actor guess the current race from the Hong Kong clock.Leave empty for live tracking, or enter a specific race number if you want to focus on one race.
Baseline Lookback (minutes)How old a previous snapshot is allowed to be. The actor ignores snapshots older than twice this value.5 if you run every minute; 15 if you run every 10–15 minutes.
Steamer Threshold (%)How much WIN odds must drop to flag a steamer. Must be negative.-15 means a 15% or bigger drop.
Drifter Threshold (%)How much WIN odds must rise to flag a drifter. Must be positive.20 means a 20% or bigger rise.
Webhook URLOptional. If set, every steamer/drifter record is sent to this URL as a JSON POST.Leave empty if you only want dataset output.
Key-Value Store NameThe name of the Apify store where snapshots are saved between runs.Keep the default hkjc-odds-snapshots unless you need to isolate different users or strategies.

A few tips

  • Smaller steamer threshold (for example -10) means more horses will be flagged as steamers.
  • Smaller drifter threshold (for example 10) means more horses will be flagged as drifters.
  • If you set Baseline Lookback too low, a single missed or delayed run can leave you without a usable snapshot.
  • If you set it too high, you may compare current odds against a snapshot that is no longer relevant.

Example: track Sha Tin race 5

Suppose you want to watch race 5 at Sha Tin and get alerts when odds move sharply.

Fill in the input like this:

{
"venue": "ST",
"race_number": 5,
"baseline_minutes_ago": 5,
"steamer_threshold_pct": -15,
"drifter_threshold_pct": 20,
"webhook_url": "https://hooks.your-site.com/hkjc-alerts",
"store_name": "hkjc-odds-snapshots"
}

Then schedule the actor to run every minute. The first run will save the baseline odds. From the second run onward, you will see dataset records like this:

{
"timestamp": "2026-07-27T12:06:00Z",
"venue": "ST",
"race_number": 5,
"horse_number": 12,
"horse_name": "Twilight Calls (GB)",
"jockey": "Saffie Osborne",
"trainer": "Richard Spencer",
"current_win_odds": 5.5,
"baseline_win_odds": 6.7,
"odds_delta_pct": -17.91,
"signal": "STEAMER",
"is_favorite": true
}

In this example, Twilight Calls’ WIN odds shortened from 6.7 to 5.5, a drop of about 18%, so the actor flags it as a STEAMER and sends it to the webhook.


Best practice: schedule the actor every minute

To get a useful stream of odds movements, create an Apify task and schedule it to run every 1 minute.

  1. Push the actor to your Apify account.
  2. In the Apify Console, create a task from this actor.
  3. Fill in the input parameters. A good starting point is:
    • Venue: AUTO
    • Race Number: leave empty
    • Baseline Lookback: 5
    • Steamer Threshold: -15
    • Drifter Threshold: 20
    • Webhook URL: your alert endpoint, or leave empty
  4. Go to the task’s Schedule tab and add a schedule that runs every 1 minute.

With this setup the actor will automatically follow the meeting, infer the current race, and flag steamers/drifters as the market moves.

If you prefer to track a single race only, set Race Number to the race you care about and the actor will stay on that race for every run.


Understanding the output

The actor writes one row per runner to the dataset, but only when it has a usable baseline snapshot to compare against.

Key output fields

FieldMeaning
timestampUTC time of the current odds snapshot.
venueST for Sha Tin, HV for Happy Valley, or any HKJC venue code such as S1, S2, H1.
race_numberThe race number.
horse_numberThe saddle cloth / runner number.
horse_nameName of the horse.
jockeyJockey name.
trainerTrainer name.
current_win_oddsLatest WIN odds.
baseline_win_oddsWIN odds from the previous snapshot.
odds_delta_pctPercentage change in WIN odds. Negative = shorter, positive = longer.
signalSTEAMER, DRIFTER, or NEUTRAL.
is_favoritetrue if this horse currently has the lowest WIN odds in the race.

The current_place_odds and current_quinella_odds fields are also included. Quinella odds are always null because HKJC’s GraphQL API returns Quinella as two-horse combinations, not per-horse values.


Sharing the actor across multiple users or strategies

The store_name parameter decides where snapshots are saved. Runs that use the same store name share the same snapshots.

  • If two tasks track different races, they will not conflict because snapshot keys include the venue and race number.
  • If two tasks track the same race at the same time, they can overwrite each other’s snapshots. To avoid this, give each user or strategy a unique store_name, for example hkjc-odds-alice, hkjc-odds-strategy-b, and so on.

Common questions

Why did the first run produce no dataset records?
The first run saves the baseline snapshot. You need a second run to compare against it.

Why are all signals NEUTRAL?
Odds did not move enough to cross your thresholds, or the baseline is too recent. Try lowering the steamer/drifter thresholds or waiting longer between comparisons.

Why is the race number wrong?
The automatic race detection uses fixed start times and 30-minute intervals. For precise control, set Race Number explicitly.

Do I need to enter a date?
No. The actor asks HKJC for the current active meeting automatically.


Data source

This actor reads from the official HKJC website.