hkjc_comments_on_running
Stewards' running comments for every Hong Kong runner
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 setupStewards' "comments on running" — a plain-language note on how each horse ran (start, position, trouble, finish), alongside placing, jockey, gear and the race's class/distance/going.
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
Rows over time
monthSchema & column quality (21 columns)
Scroll table sideways to see more columns →
| Column | Type | Description | Populated | Distinct |
|---|---|---|---|---|
| race_date | Nullable(Date) | Date of the race (YYYY-MM-DD) | — | — |
| race_no | Nullable(Int64) | Race number within the meeting | — | — |
| race_id | Nullable(String) | Canonical race identifier (venue_YYYYMMDD_RNN, e.g. ST_20250928_R01) — joins to hkjc_races.race_id, many rows here (one per horse) to one race there | — | — |
| hkjc_internal_race_id | Nullable(String) | HKJC's own per-season numeric race id, as shown in parentheses on the page (resets each season — not a cross-dataset join key; use race_id for joins) | — | — |
| race_name | Nullable(String) | Race name (e.g. SUNBIRD PLATE) | — | — |
| rating | Nullable(String) | Race rating band, blank when not applicable | — | — |
| distance_m | Nullable(Int64) | Race distance in metres | — | — |
| venue | Nullable(String) | Racecourse — Sha Tin or Happy Valley | — | — |
| going | Nullable(String) | Going (track condition), e.g. Good To Yielding | — | — |
| placing | Nullable(Int64) | Finishing placing as a number (NULL when non-numeric, e.g. WV/DH) | — | — |
| placing_raw | Nullable(String) | Finishing placing exactly as the source shows it, including the non-numeric outcome codes a finishing position cannot express: PU (pulled up), UR (unseated rider), FE (fell), DNF (did not finish), TNP (took no part), DISQ (disqualified). Numeric where the horse completed the race; `placing` carries the same value typed as an integer, and is null for every coded outcome. | — | — |
| horse_no | Nullable(String) | Horse's saddle number in the race | — | — |
| horse | Nullable(String) | Horse's name in English, with the trailing brand parenthetical removed (that value is in brand_code) | — | — |
| brand_code | Nullable(String) | Horse's HKJC brand number exactly as the page shows it (e.g. L441; historical horses carry a cycle prefix and render two letters, e.g. BT163 — horse_id embeds only the trailing form, HK_1998_T163) | — | — |
| horse_id | Nullable(String) | Canonical horse identifier (HK_YYYY_XXXX format) | — | — |
| jockey | Nullable(String) | Jockey who rode the horse | — | — |
| gear | Nullable(String) | Equipment carried (HKJC gear codes, e.g. TT = Tongue Tie, B = Blinkers). See gear_label for the decoded form. | — | — |
| gear_label | Nullable(String) | Equipment decoded to words, e.g. 'Visor (removed) / Blinkers (2nd time) / Tongue Tie'. 'No gear' where the raw code is '--'. Codes are HKJC's own (Equipment Register, racing.hkjc.com/en-us/local/page/reg-approved-gear); a trailing 1/2 means first/second time worn and a trailing '-' means removed this start. Unrecognised codes pass through unchanged. | — | — |
| comment | Nullable(String) | Stewards' comment describing how the horse ran in the race | — | — |
| updated_at | Nullable(DateTime64(3)) | Timestamp this row was last (re)parsed into the warehouse | — | — |
| 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. | — | — |
Last 12 months of stewards' comments on running, every runner in every meeting, full schema and no row cap.
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
- Sep 2000 – 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
- 1,000,000 rows/month included
Included Datasets
- 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