Most racing datasets stop at the result. Hong Kong gives you something extra: a public record of the veterinary notes the Jockey Club attaches to its horses, from lameness and withdrawals to what a scope found in the windpipe after a race. We hold 53,966 of these notes, and they are some of the least used data in the archive.
Below, the Hong Kong veterinary records as they actually look, with the counts, and some advice on turning free text into something a model can use.
What a record looks like
Each record has a horse, a race, a horse number, a date, a block of free text, and a “passed on” date where one exists. That is all. The text is the interesting part, and it reads like a clinical note. Three real examples, in the Jockey Club’s own words:
- “Lame left front leg on the day after racing.”
- “Arthroscopic surgery to right knee (bone fragment removal).”
- “Substantial mucus in trachea noted on post-race scoping.”
Records run from 26 September 2016 to September 2026. About 1,690 of them have no date at all, so filter before you plot anything against time.
How many, and when
The volume has changed a lot over the years, and that matters if you are tempted to draw a trend.
| Year | Records |
|---|---|
| 2019 | 710 |
| 2020 | 2,560 |
| 2021 | 4,360 |
| 2022 | 8,433 |
| 2023 | 14,537 |
| 2024 | 12,150 |
| 2025 | 7,730 |
Do not read that as a rise and fall in injuries. Those numbers reflect what was published, and when we collected it, as much as what happened on the track. Compare notes within a year, or normalise by the number of runners, but not across years without a good reason.
The reasons that come up most
We counted the first 60 characters of each note. The commonest ones:
| Note | Records |
|---|---|
| Unacceptable performance. | 5,468 |
| Castration. | 4,520 |
| Substantial blood in trachea noted on post-race scoping. | 3,654 |
| Disappointing performance. | 2,323 |
| Substantial mucus in trachea noted on post-race scoping. | 1,983 |
| Eight years of age or above at season end. | 1,361 |
| Unraced for 12 months. | 1,131 |
| Rider concerned horse’s action during racing. | 1,062 |
| Heart irregularity noted after racing. | 879 |
| Lame right fore. | 794 |
Look at the shape of that list. A lot of entries are not injuries. “Castration” is a management event, and “Eight years of age or above” and “Unraced for 12 months” read like routine flags rather than findings. A headline count of “vet records” overstates how many horses were hurt, which is the first thing to fix in any analysis.
How long a horse is out
The “passed on” date is the part most people overlook, because it turns a note into a duration. 44,635 of the 53,966 records have one. Measured from the date of the note to the passed-on date, the median is 30 days. The middle half of records fall between 16 and 85 days, and one in ten takes more than 137.
The reason matters a lot:
| Note starts with | Records | Median days |
|---|---|---|
| Unacceptable performance | 7,452 | 20 |
| Substantial blood in trachea | 3,963 | 20 |
| Disappointing performance | 2,928 | 19 |
| Heart irregularity | 1,561 | 36 |
| Lame | 7,702 | 43 |
Lameness keeps a horse out more than twice as long as a performance concern. That is the sort of simple, checkable fact you cannot get from results alone, and it is a sensible feature if you are modelling how quickly a horse returns.
Making the text usable
Free text is awkward, and the vocabulary is fairly small, so a handful of rules gets you most of the way. A starter in Python:
import re
RULES = [
("withdrawn", r"withdrawn"),
("lameness", r"blameb|swollen|abrasion"),
("scoping", r"scoping|trachea|mucus|blood"),
("cardiac", r"heart|irregularity"),
("surgery", r"surgery|castration|operation"),
("performance", r"performance|rider concerned"),
("administrative", r"years of age or above|unraced for"),
]
def classify(details):
text = (details or "").lower()
return [name for name, pattern in RULES if re.search(pattern, text)] or ["other"]
A note can belong to more than one category, so keep the result as a list. Run it over a sample and read what falls into “other”. Expect to add rules.
Once you have categories, the useful questions become straightforward. How long between a note and the horse’s next run? How does a horse perform after a scoping finding compared with before? Do trainers differ in how often a horse comes back after a lameness note? Those need care, because the sample is small once you split it, and none of it is medical advice.
Joining it to the rest
Most records have a race identifier and a horse identifier, so they join to the results and racecards the same way anything else does. About 2,500 of the 53,966 are missing one or the other, so count the rows that fail to join before you trust a total. The API exposes four veterinary endpoints: the latest records, by date, by race and by horse. The Hong Kong datasets include the whole table, and the Hong Kong racing guide shows where it sits next to the rest of the archive.
Treat the notes as what they are: short, factual and sometimes administrative. A horse withdrawn on veterinary grounds also shows up as WV in the place column, the commonest non-finishing code in Hong Kong, and the result codes guide lists the rest. To see the records yourself, start with the API.

Comments are closed