hkjc_odds_final
Hong Kong horse racing closing odds and market data
Browse on hkjc.guru: 2026-10-19 ST
Download a file
CSV and Parquet. 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 setupClosing odds for Hong Kong races (Sha Tin and Happy Valley): for every pool and combination, the last price HKJC published before the race's post time, taken from the same movement series as HKJC Odds Movements, so the two never disagree. Win and Place from 8 December 2021; the exotic pools (Quinella, Quinella Place, Forecast, Trio, First Four, Double, and the top-20 and banker lists) from 1 October 2024, with the same gaps as HKJC Odds Movements. Compare closing odds with results to backtest, value runners or study favourites. A race appears once it has started. A pool has closing odds only where its last quote before the off was published within 60 minutes of it: the Win pools of 32 races have none because we hold no quote from that last hour (Happy Valley races 6-7 on 4 January 2023; Sha Tin races 5-7 on 29 January 2023; Happy Valley races 1-4 on 13 September 2023; Sha Tin races 1-10 on 29 December 2024; Sha Tin races 1-7 on 28 June 2025; and Happy Valley races 1-6 on 28 January 2026), and every other pool that trades up to the off is held to the same rule; presales pools (*Pre) and the PWIN snapshots carry their last quote whatever its age. 18 Hong Kong meetings since 8 December 2021 have no closing odds at all: 10 September 2023; 3, 6, 10 and 13 March 2024; 8, 11, 15, 18, 22, 25 and 28 September 2024; 3, 6 and 9 November 2024; and 7, 11 and 14 January 2026. Post times before 2026 are mostly derived from pool closure rather than a published race card (see race_start_time).
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 (21 columns)
Scroll table sideways to see more columns →
| Column | Type | Description | Populated | Distinct |
|---|---|---|---|---|
| odds_final_key | String | Unique identifier for this final odds record. | — | — |
| 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 S1-S5 for an overseas race simulcast in Hong Kong. Empty only where a row's venue could not be established, and then race_id is empty too. | — | — |
| race_number | Int32 | Race number within the meeting: 1-11 at Hong Kong meetings, 1-10 on simulcast cards. | — | — |
| race_id | Nullable(String) | Unique race identifier for joining with hkjc_races (format: ST_20250928_R01) | — | — |
| racename | Nullable(String) | Official race name. | — | — |
| venue | Nullable(String) | Full venue name (Sha Tin / Happy Valley). | — | — |
| distance_category | String | Distance grouping: Sprint, Mile, Middle, Long. | — | — |
| track_condition_category | Nullable(String) | Simplified track condition grouping. | — | — |
| field_size | Int64 | Number of horses in the race. | — | — |
| odds_type | String | HKJC pool code. The base pools: WIN, PLA (Place), QIN (Quinella), QPL (Quinella Place), FCT (Forecast), TRI (Trio), FF (First Four), DBL (Double), each a complete matrix of every combination. Suffixed variants are separate lists HKJC publishes alongside them: *Top = the 20 lowest-priced combinations (TCETop, TRITop, FFTop, QTTTop; QINTop/QPLTop on simulcast races); *Banker = for each runner taken as banker, the 10 lowest-priced combinations containing it (for TCE and QTT, with that runner first); *Pre = the pool's odds during HKJC's presales (advance-selling) period; PWIN0/PWIN1 = two Win-odds snapshot series HKJC publishes for its PWIN page, which its own site code names '1stBoost' and 'slide2m' (carried as published; HKJC does not document them further). There is no complete Tierce (TCE) or Quartet (QTT) matrix: HKJC does not publish one, so their Top and Banker lists are all the ordered Tierce and Quartet odds that exist. | — | — |
| odds_category | String | The bet the pool belongs to, grouping odds_type and its variants: Win/Place, Quinella (QIN, QPL), Forecast, Tierce, Trio, First Four, Quartet, Double. | — | — |
| combination | String | The bet, as HKJC writes it: a runner number for WIN/PLA, two digits ('01') from 29 September 2024 and unpadded ('1') up to 14 July 2024, so compare it as a number; two-digit runner numbers joined by commas for single-race pools ('01,02' Quinella/Forecast, '01,02,03' Trio/Tierce, '01,02,03,04' First Four/Quartet); one runner per race joined by '/' for Double ('01/03'). Unordered pools (Quinella, Trio, First Four) list runners in ascending order; ordered pools (Forecast, Tierce, Quartet) in finishing order. | — | — |
| odds_value | Nullable(Float64) | Decimal odds as HKJC quotes them: the return per $1 staked, stake included (5.5 = $5.50 back for $1). HKJC displays every pool except Quartet capped at 999, so 999 means '999 or more' (a quarter of Trio rows and over half of First Four rows sit at the cap); Quartet runs to 99999. NULL where HKJC shows no price: a combination including a scratched runner (HKJC prints SCR) or a pool not yet priced. | — | — |
| is_hot_favourite | Nullable(Bool) | HKJC's hot-favourite flag on this runner or combination. NULL where HKJC publishes no flag (Banker-list rows). | — | — |
| final_odds_timestamp | DateTime64(3) | HKJC's published time (UTC) of the last odds movement before race_start_time: the moment this closing price was set. | — | — |
| race_start_time | Nullable(DateTime) | The race's post time (UTC). Where we hold the published race-card time it is that; for most races from December 2021 to December 2025 no race-card time was captured, and it is derived instead as the time of the race's last Win-odds movement (pools close at the off), which runs about 1.5-7 minutes after the actual start. | — | — |
| minutes_before_start | Nullable(Int64) | Minutes between final_odds_timestamp and race_start_time. A pool that trades up to the off has closing odds only if this is 60 or less: where our capture stopped earlier than that before a race, the pool is left out rather than given a stale price. Presales pools (*Pre) and the PWIN snapshots are exempt: their last quote is early by design. | — | — |
| odds_format | String | Which collection arm the row came from: legacy_semicolon (Dec 2021 - Jan 2026), modern_json (Sep 2025 - Jan 2026) or graphql_v2 (from Jan 2026). | — | — |
| 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. | — | — |
Closing odds for every pool of the latest completed meeting, from race 1 onward. The file stops at 10,000 rows, which is about the first seven races of a meeting.
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