hkjc_odds_combinations
Hong Kong horse racing live odds history and market movements
Download a file
CSV · Excel · Parquet · JSON. Filtered exports.
See pricingQuery with SQL
DBeaver, DuckDB, MotherDuck, or HTTPS. Sub-second latency.
Open connection detailsConnect to AI
MCP for Claude Desktop, Cursor, ChatGPT, Goose. 1-line install.
See setupComplete time-series of all Hong Kong horse racing odds, including: per-horse Win odds with movement history, per-horse Place odds with movement history, and exotic bet odds (Quinella, Forecast, Tierce, Quartet, First Four, Double). Track how odds changed in the lead-up to each race - from opening prices to final closing odds. Identify which horses attracted late money, spot market confidence shifts, and analyze betting patterns. One row per odds MOVEMENT: each row is a change in a pool's odds, timestamped with HKJC's own published update time (snapshot_timestamp, UTC); repeated unchanged states are not stored — interpolate flat between rows. observed_at records when our collector first saw the state; timestamp_source marks the residue (certain exotic matrices) where HKJC publishes no update time. Resolution follows the collection era: polling ran ~5 minutes for most of Dec 2021 – mid-2023 and late 2024 – 2025, ~1 minute mid-2023 – Q3 2024 and since May 2026, so moves inside one polling interval collapse into the latest one and sub-minute resolution exists from June 2026 onward.
Evaluate it in full below: the evidence and a working sample are open to everyone. Buy or subscribe to unlock the complete dataset — your account is created automatically at checkout.
The evidence
Schema & column quality (15 columns)
Scroll table sideways to see more columns →
| Column | Type | Description | Populated | Distinct |
|---|---|---|---|---|
| race_date | DateTime | Date of the race meeting (YYYY-MM-DD). | — | — |
| venue_code | String | Venue code: 'ST' (Sha Tin) or 'HV' (Happy Valley) for Hong Kong races, or a simulcast venue code (S1-S5). May be empty on some legacy rows where the source did not carry a venue. | — | — |
| race_number | Int64 | Race number within the meeting (1-11). | — | — |
| race_id | Nullable(String) | Unique race identifier for joining with hkjc_races (format: ST_20250928_R01) | — | — |
| odds_type | String | Bet/pool type code (e.g. WIN, PLA, QIN, QPL, FCT, TRI, TCE, FF, QTT, DBL). | — | — |
| odds_category | String | Bet category grouping the odds_type: Win/Place, Quinella, Forecast, Tierce, Trio, First Four, Quartet, Double, Treble, Double Trio, Triple Trio, Six Up, Composite Win, Index Win, Other. | — | — |
| combination | String | Horse number (WIN/PLA) or combination string (e.g. '1-2' for Quinella, '1-2-3' for Tierce). | — | — |
| odds_value | Nullable(Float64) | Decimal odds value (e.g. 5.5 means a $5.50 return per $1 staked). | — | — |
| is_hot_favourite | Nullable(Bool) | True if this horse/combination was marked as the hot favourite. | — | — |
| snapshot_timestamp | DateTime64(3) | When this odds state was published by HKJC (UTC) — the Jockey Club's own update time, not our collection clock (timestamp_source = 'hkjc_published'; the small residue where HKJC publishes no update time carries the collection clock instead, marked 'scrape_clock'). One row per movement: repeated unchanged states are not stored, so consecutive rows for a pool are genuine odds changes. Resolution follows the collection era — polling every ~5 minutes for most of Dec 2021 to mid-2023 and late 2024 through 2025, every ~1 minute mid-2023 to Q3 2024 and since May 2026 — so moves inside one polling interval collapse into the latest one. | — | — |
| timestamp_source | Nullable(String) | Where snapshot_timestamp comes from: 'hkjc_published' = HKJC's own published update time (the norm); 'scrape_clock' = our collection clock, used only where HKJC publishes no update time (certain exotic combination matrices, and a small residue of early-era rows whose embedded time could not be decoded). | — | — |
| observed_at | Nullable(DateTime64(3)) | When our collector first observed this odds state (UTC). The gap between observed_at and snapshot_timestamp bounds the detection latency; the spacing of observed_at values reflects the collection era's polling interval. | — | — |
| sell_status | Nullable(String) | Pool sale state at first observation, as published by HKJC: START_SELL (open for betting) or STOP_SELL (closed). NULL on the older collection eras that did not carry it. Use it to cut a race's series at market close cleanly. | — | — |
| updated_at | DateTime64(3) | Timestamp when the record was last updated. | — | — |
| id | String | Stable unique identifier for this row — the last column of every export. Use it to deduplicate, to key an incremental load, or to reference one specific row. It is additive: the entity and join keys you already use (race_id, horse_id, and the like) are unchanged. | — | — |
One full race meeting day of odds combinations (Quinella, QPL, Trio, Tierce, Trifecta, First-4), full granularity. Live odds in the subscription stream this same shape continuously.
Choose your access
A Pass gives you freshness within a rolling window. The Full Archive gives you the full history we hold for the dataset, frozen at purchase. They solve different problems, and they work together.
One-off purchase
Full Archive
The full history we hold, frozen at purchase. Yours to keep.
Full details →- What you get
- The full history we hold, to your purchase date
- History depth
- Dec 2021 – present, in full
- Updates
- None. Frozen at purchase
- Delivery
- Gzipped CSV, opens in Excel; link valid 7 days
- API access
- Not included
- Access window
- Most recent 24 months, rolling
- Updates
- Continuous, within hours of the source
- Delivery
- API, SQL and downloads
- Exports
- Uncapped
Included Datasets
Get notified when this dataset is updated.
Questions about this data?
Our data experts are ready to help clarify any aspects of this dataset.
Contact Our Team