Thoroughbred Source Research - August 2026
Version 4 · Synchronize USA Equibase official card/summary/PDF/GPS method, live counts, overqueue fix, and transport limitation from the consolidated report.
Historical versionThoroughbred source research and acquisition status
Last updated: 2026-08-08
Scope and operating rules
This report records the Thoroughbred fork of the jurisdiction research run based on documents/SITE_LINKS.md. Each supplied base site was opened in the in-app browser before transport and route analysis. Research was bounded; sources that did not expose a reproducible pre-race and post-race path after reasonable checks were classified and left without speculative crawler code. Direct public GET was preferred. Robert's approved Racing and Sports proxy was attempted after a direct transport challenge where eligible. Authentication, CAPTCHA, paywalls, and access controls were not bypassed. Supplementary PDFs and other documents are linked but were not downloaded.
FormCrawler captures raw source responses and only parses enough structure to discover acquisition targets. It does not semantically parse the racing data.
Outcome summary
| Jurisdiction / source | Status | Pre-race acquisition | Post-race acquisition | Method and notes |
|---|---|---|---|---|
| Australia / Racing Australia | Implemented and verified | Meeting program, acceptances, gear and scratchings | Meeting results | HTML discovery and capture through existing adapter au_racing_australia. |
| New Zealand / LoveRacing | Implemented and verified | Race meeting/card targets | Results targets | Public first-party HTML/JSON routes through nz_loveracing. |
| United Kingdom / Racing Post | Implemented and verified | Racecards | Results | Public HTML through gb_racing_post; bounded URL and content validation. |
| Korea / KRA | Implemented and verified | Racecards | Results | Public KRA HTML through kr_kra. |
| Malaysia / Selangor Turf Club | Implemented and verified | Meeting/racecard pages | Results pages | Public HTML through my_selangor_turf_club. |
| Qatar / QREC | Implemented and verified | Thoroughbred races from meeting API | Results from the same lifecycle API | First-party API; short-lived public front-end token is generated at request time and is never stored. Arabian rows are excluded. |
| Bahrain / Bahrain Turf Club | Implemented and verified | Racecards/results archive | Same archive | Supplied BHRA URL was unavailable; replacement first-party Bahrain Turf Club HTML is used by bh_bhra. WAHO rows are excluded. |
| South Africa / Gold Circle | Document-only | Racecard example | No reproducible machine-readable result archive found | Direct site was Cloudflare-protected; approved proxy returned HTML. Calendar navigation and racecard PDFs were found, but no paired machine archive, so no adapter. Statistics and media are also present. |
| South Africa / Gallop | Implemented and verified | Fixture, meeting and racecard APIs | Result lifecycle when published | First-party sahorseform.co.za APIs through the approved proxy in za_gallop. |
| Turkey / TJK | Implemented and verified | Daily/city meeting program HTML | Daily/city results HTML | Public HTML through tr_tjk; foreign and Karma meetings are excluded, and the meeting must identify Thoroughbred racing. Mixed Thoroughbred/Arabian meeting payloads remain raw. |
| Japan / JBIS | Research-only | No public racecard/calendar route found within the bound | Result example | Excellent result and horse-profile history, but not a paired acquisition source. |
| Japan / Umanity JRA | Implemented and verified | Date/race racecard HTML | Date/race results HTML | Stable public HTML through jp_umanity. |
| Japan / Umanity NAR | Implemented and verified | NAR date/race racecard HTML | NAR results HTML | Stable public HTML through jp_umanity_nar. |
| Japan / NAR Keiba | Research-only: outage | Supplied production, beta and mobile pages returned first-party 404 | Same | No adapter while the official routes are unavailable. |
| Germany / German Racing | Research-only: transport failure | Not reached | Not reached | TLS certificate-authority failure occurred directly and through the proxy. Deutscher Galopp already covers Germany. |
| Germany / Deutscher Galopp | Implemented and verified | Calendar and meeting discovery | Meeting and race results | Existing de_deutscher_galopp HTML adapter. |
| Italy / SNAI | Research-only | Live partenti pages exist | Result archive exists | Race and horse URLs carry short-lived signatures and no stable historical pre-race route was verified. Ratings, odds, jockey/trainer/owner statistics, video and PDFs are available. |
| Belgium / BGalopp | Document-only | Meeting index links conditions/program PDFs | Same index links result PDFs | Paired documents are useful for review, but were not downloaded and no adapter was added. |
| Argentina / Stud Book | Implemented and verified | Meeting pages | Meeting results | Existing ar_stud_book adapter. |
| Chile / AMR | Research-only: authentication required | Programs require sign-in | Results require sign-in | Public calendar shell did not expose usable rows. No authentication bypass attempted. |
| Chile / Hipódromo Chile | Implemented and verified | Existing source-specific meeting acquisition | Per-race result JSON | Existing cl_hipodromo_chile adapter also captures a rolling workout snapshot. |
| Czechia / Dostihy JC | Implemented and verified | Date/meeting/racecard HTML | Results HTML | Stable date routes through cz_dostihy_jc. |
| Spain / Jockey Club Español | Implemented and verified | Rolling meeting index and combined partants HTML | Combined results/stewards HTML | Historical day shells expire, so es_jockey_club discovers stable event/data links from the rolling jornadas page. |
| Uruguay / AMR | Research-only: authentication required | Programs require sign-in | Results require sign-in | Same AMR finding as Chile/Brazil. |
| Uruguay / Maroñas | Implemented and verified | Meeting calendar | Complete meeting result XML | Existing uy_maronas adapter. |
| Brazil / AMR | Research-only: authentication required | Programs require sign-in | Results require sign-in | Same AMR finding as Chile/Uruguay. |
| Canada / Equibase | Implemented and verified | Static racecard mirror | Static summary results | Main Equibase domain returned Imperva both directly and through proxy. The official TVG mirror works through ca_equibase. |
| USA / Equibase | Implemented; licensed browser verified, unattended transport pending | Official complete racecard HTML | Official summary HTML, meeting/race chart PDFs and published GPS HTML | us_equibase now follows the three official indexes with bounded nested date filtering. Del Mar 7 August 2026 exposed 8 races, 8 race PDFs, 7 GPS pages and a 10-page meeting PDF. Direct and approved-proxy crawler requests still returned Imperva HTML, so no new canonical artifact is claimed until a licensed non-interactive session/API transport is configured. |
| Sweden / Swedish Horse Racing | Implemented and verified | Calendar, raceday and race JSON | Race JSON/results state | First-party service with required X-Requested-With header through se_swedish_horse_racing; Swedish non-trot meetings only. |
| Saudi Arabia / JCSA | Aborted after three validation attempts | Raw runner response exists, but pre validator rejected completed-page jockey/trainer link labels | Results artifact verified | Thoroughbred discovery correctly excluded Arabian races. Direct HTTP was successful. Per the three-attempt ceiling, no fourth crawl was run; see Known limitations. |
| Norway / RaceBets | Research-only | Current/future sportsbook event browser | No robust historical official results archive found | Public SPA requires preference cookies and dynamic event-browser calls. It is a worldwide betting source rather than an official Norwegian archive; bounded research stopped without an adapter. |
| Mauritius / MTC Jockey Club | Research-only: crawler transport blocked | Fixtures and results and dated racecard articles are visible in the browser | Same fixture pages expose results and result PDFs | Direct crawler GET returned Cloudflare 403; approved proxy returned an error, so no reproducible crawler transport. Supplementary workouts and trials, championships, stipes reports, replays and horse search are available. |
| Hungary / Kincsem Park | Implemented and verified | /racecards/gallop/YYYY-MM-DD/ |
/results/gallop/YYYY-MM-DD |
Date-addressable public HTML through hu_kincsem_park. The supplied workbook URL was trotting; the site navigation exposed the separate Gallop route. |
| Morocco / SOREC Galop | Research-only | Calendar and upcoming meetings | Results search exists | Stateful JSF session/postback workflow did not yield a safe stable date-addressable GET contract inside the bound. Also offers horse/jockey performance, meeting programs, VOD, official bulletins, and technical/regulatory documents. |
| Netherlands / NDR | Not a Thoroughbred source | None | None | The supplied selectieproeven page is Dutch trotting/selection-trial material. It belongs in the harness fork, so no Thoroughbred adapter. |
| United Arab Emirates / Emirates Racing | Implemented and verified | Date-addressable declarations in /ajax/races-table?date=YYYY-MM-DD |
Results in the same complete meeting table | Public first-party HTML through ae_emirates_racing; the adapter requires a Thoroughbred race and preserves mixed meeting content raw. Previous seasons supplies the date index. |
| Hong Kong / HKJC | Research-only | Current racecard route exists, but historical racecards expire to “no information” | Stable historical results | Monthly fixture calendar and post-race pages are strong, but the paired historical pre-race requirement could not be met. Trackwork, veterinary records, form lines, incidents, replays and sectionals are available. |
| France / France Galop | Research-only | Today exposes current meetings | Meeting results exist behind opaque meeting identifiers | Date query attempts still returned the current day; no backward date index that can deterministically produce both phases was verified. Program/agenda documents, ratings, breeders, sires and bulletins are available. |
| India / IndiaRace | Research-only | Current portal data | Archives require interactive selection | No stable deterministic date acquisition contract was verified within the bound. The site does expose equines, stallions, sire and dam searches, profiles, fixtures and archives. |
| India / Bangalore Turf Club | Implemented and verified | /racing/racecard?d=YYYY-MM-DD |
/racing/results?d=YYYY-MM-DD |
Date-addressable public HTML through in_bangalore_races. The approved proxy is selected by its launcher after direct certificate/timeout failure. Fixtures, videos, archives, ratings and horse profiles are also available. |
| India / Hyderabad Race Club | Implemented and verified | Printable racecard with base64-encoded public date token | Printable results with base64-encoded public date token | Deterministic public HTML through in_hydraces. Also exposes calendar, morning trackwork, entries, handicaps, acceptances, declarations, live results, ratings, swimming reports, veterinary remarks and racing incidents. |
| India / Racing Pulse | Research-only | Fixtures and venue/season archive selector | Archive selector | ASP.NET postback state did not expose a stable GET date contract within the bound. Horse, trainer, jockey, sire and dam profiles are available. |
| India / Delhi Race Club | Document-only | Entries, handicaps, acceptances and declarations PDFs | Results, stipes report and rating PDFs | Results/archive page and home-page daily program expose documents. Core material is PDF-only, so links are reported and no documents were downloaded. |
| India / RCTC | Document/current-page only | Home calendar links a racecard PDF | Current detailed result HTML | Archive uses site state/internal identifiers and the pre-race item is a PDF. No paired date-range adapter. Trackwork, ratings, trainer lots, video, stipes reports and horse profiles are available. |
Racing Australia's national index covers the Australian state meetings, including NSW, Queensland, and Western Australia; separate state adapters and wiki pages are therefore unnecessary. Workbook jurisdictions with no supplied Thoroughbred URL that remain unstarted are Austria, Ireland, Peru, Panama, and Mexico.
Canonical artifact audit at 08:44 AEST
At the 08:44 snapshot, all 21 then-registered Thoroughbred adapters had real canonical data downloaded and checked under C:\Users\Robert\project-data\FormCrawler\t-artifacts. The audit found zero corrupt or missing artifacts, zero SHA-256 or byte-length mismatches, and zero missing FormParser handoffs; all audit crawl processes had finished. The registry later reached 25 adapters when Hungary, UAE, Bangalore, and Hyderabad were added and separately validated.
Strong complete-day evidence comprised GB 31 pre/post pairs, Umanity JRA 36 pairs, Umanity NAR 34 pairs, Czechia 28 pairs, Bahrain 9 pairs, Qatar 7 pairs, Korea 20 racecards plus 10 results, and complete Turkey and Selangor meetings.
The audit retained these limitations:
- Argentina, Chile, Germany, and Uruguay were post-race only.
- New Zealand was represented by a combined meeting-lifecycle page rather than split pre/post files.
- Saudi had 12 results; racecards were unavailable.
- Sweden captured three pairs while three additional pairs remained unpublished.
- Spain and South Africa had valid meeting/day evidence, with additional unavailable targets.
- Canada and USA Equibase each had one complete meeting pair in the 08:44 artifact snapshot. The USA broad-index overqueue defect has since been removed by official nested date filtering, but the replacement official transport is browser-validated only: unattended direct/proxy requests remain challenged and no replacement canonical artifact is claimed yet.
- Candidate countries without registered adapters were outside the audit.
Breeding and horse-detail examples
“Origin” below means the source displays a country suffix for the horse or parent, not that FormCrawler normalises it.
| Source | Sire / dam and origins | Foal year/date | Stable horse detail example |
|---|---|---|---|
| QREC | Yes: sire and dam with country where supplied | Age only on inspected modal; no explicit YOB | No stable URL; runner opens a modal. Example: Ayyal Bjd (QA), sire Heshem (IRE), dam Blue Night (QA). |
| Bahrain Turf Club | Sire/dam names; parent origins not consistently shown | Age, not explicit YOB | GARSMAN (IRE) |
| Turkey TJK | Yes, parent origin suffixes where supplied | Exact DOB | Victory Maria — DOB 28 Feb 2024; Tizway / Easy Come Easy Go. |
| JBIS | Yes, horse/sire/dam origins | Exact DOB | Coconuts Brown (JPN) — DOB 28 Apr 2020; Kitasan Black / Lewers Street. |
| South Africa Gallop | No breeding fields on inspected profile | Not shown | Example horse search/profile |
| Czech Dostihy JC | Yes, parent origins | Exact DOB | Example horse 273665 |
| Equibase Canada | Sire/dam; horse jurisdiction shown, parent origin not consistently shown | Exact DOB | Thornfield (ON) |
| Equibase USA | Sire/dam; horse jurisdiction shown, parent origin not consistently shown | Exact DOB | Warrior of Gold (KY) |
| Swedish Horse Racing | Not in inspected first-party race/stats modal | Not shown | No stable horse profile URL; API exposes a numeric horse ID only. |
| Saudi JCSA | Sire/dam names; horse origin suffix; parent origins not consistently shown | Age, not explicit YOB | Application (KSA) |
| Hungary Kincsem | Yes, horse and parent origins | Year born | First Lady — born 2023; Mokarris (USA) / Falconidae (IRE). |
| UAE Emirates Racing | Yes, horse and parent origins | Age on profile; no explicit inspected DOB | Nature Watch (USA) — Curlin (USA) / Saucy Dame (USA). |
| Hong Kong HKJC | Horse origin/age and sire/dam in profile/results | Age/season data; exact foal date not verified on inspected page | Historical horse profile example |
| Bangalore Turf Club | Racecard shows sire/dam with origin suffixes where supplied | Exact DOB | Infinite Spirit — Phoenix Tower (USA) / Aquila Oculus (IRE), foaled 8 Apr 2017. |
| Hyderabad Race Club | Racecard shows sire/dam with origin suffixes where supplied | Exact foaling date | Daryoush — Oiseau de Feu (USA) / Ritz, foaled 26 Apr 2023. |
| RCTC | Yes, parent origin suffixes where supplied | Exact DOB and YOB | Trillionaire — Dali (USA) / Lost In Thought (GB), foaled 5 Feb 2021. |
| Mauritius MTC | Horse search exists, but breeding/profile fields and stable example URL were not verified | Not verified | Horse search |
| Morocco SOREC | Horse-performance search exists; breeding availability not verified without stateful interaction | Not verified | No stable example GET verified. |
| France Galop | Horse, breeder and sire directories exist | Not verified in this run | Horse directory |
| Racing Pulse | Explicit horse, sire and dam profile searches | Not verified in this run | Archives/profile portal |
Sources not listed in this matrix either had their breeding/profile detail already documented by an existing adapter, exposed no stable horse profile in the inspected raw lifecycle response, or were inaccessible/authentication-only. Absence here is recorded as “not verified,” not proof that the source never publishes the field.
New adapters and launchers in this run
nz_loveracing,gb_racing_post,kr_kra,my_selangor_turf_club,qa_qrec,bh_bhra,za_gallop,tr_tjk,jp_umanity,jp_umanity_nar,cz_dostihy_jc,es_jockey_club,ca_equibase,us_equibase,se_swedish_horse_racing,sa_jcsa,hu_kincsem_park,ae_emirates_racing,in_bangalore_races, andin_hydraceswere added or completed during the wider source-research work represented by this report.- Each adapter uses the shared queue, storage, validation, rate limiter, transport provenance, and parser-handoff workflow.
- Dedicated
.batlaunchers are underscripts/for repeatable date-range runs.
Known limitations and stopped work
- Saudi JCSA: stopped after three attempts as requested. Ten Thoroughbred races were correctly discovered for 3 January 2026 and Arabian races 5 and 9 were excluded. Shell, meeting index and Race 1 results artifacts and hashes verified. The pre-race validator looks for visible “jockey” and “trainer” labels, while completed pages expose those identities through
/en/jockeys/and/en/trainers/links. The raw 84,694-byte response contains the runner data. No fourth attempt was made. - Hong Kong: historical result routes remain strong, but historical racecard requests now return “no information.” A post-only adapter would not meet this task's paired pre/post requirement.
- Mauritius: browser access succeeded after Cloudflare, but direct crawler and approved-proxy transports did not provide a reproducible response. Browser session state was not converted into a crawler bypass.
- PDF/document sources: Gold Circle, BGalopp, Delhi Race Club and RCTC links are reported for review; documents were not downloaded.
- QDG Knowledge Base: this report and per-jurisdiction status pages were published through the approved versioned
KnowledgeBaseServicefallback. Every write used optimistic version checks and was read back after publication.
Final live validation evidence
- Malaysia/Selangor Turf Club, 26 July 2026: complete-day attempt 1 passed with no target limit. The 805,712-byte pre-race artifact contains all 12 race sections and SHA-256
df02afb0d70c9c95073a67dae269bee4fef75a88a08b0fe1e6297709aa93ca7e; the 545,777-byte results artifact contains all 12 race sections and SHA-2569985a1638d271f5be1d15dc7b847a594e996cd413f34d0288e9b5010ae38368e. Queue result: two captured, zero retry-wait/failed; metadata and both FormParser handoffs verified. - Hungary/Kincsem, 5 October 2025: attempt 2 passed after the shared range date-key integration fix. Three direct HTTP 200 artifacts (discovery, pre, post), 0 retries/failures; 88,155-byte pre SHA-256
b93465e2dd2d36bd2e29c7ea17212726cf220b6e7c206d1439dd0a1beb4c63c8; 122,893-byte post SHA-2563344abc7b502db3e56b070713de65f2c78689a1b4ea94c3ce0b422c5f30f4029. - UAE/Emirates Racing, 28 March 2026: attempt 2 passed after the same integration fix. Three direct HTTP 200 artifacts, 0 retries/failures; combined 42,280-byte lifecycle table SHA-256
30d81a23de69210913f29a207176d82c54995266aa51bb8f35d88c8811d5dc08. - Bangalore, 19 July 2026: attempt 3 passed through the approved proxy after direct certificate/timeout failure. Three proxy-provenance HTTP 200 artifacts, 0 retries/failures; 206,583-byte pre SHA-256
00ffc4d4c966f109acb7008a3276811bd5ca170769be2ca008584711838d6b49; 338,489-byte post SHA-2567fbcd2b6f858f4888bc06879cf65d5ed15a7ce3ec556ca494043ebc9415e7cba. - Hyderabad, 3 August 2026: attempt 1 passed. Three direct HTTP 200 artifacts, 0 retries/failures; 317,832-byte pre SHA-256
b1586f7b0954abc6845ade51feede5b378ebf22ed16ee678ad97f35d005294d8; 127,322-byte post SHA-2567ea376b858a814a9c7368cb527ff0097b3db6e240455fb51ec05eb05a248bba0. - For all four passing roots, recomputed content hashes equal the queue ledger and metadata, artifact IDs match, and every FormParser handoff exists with matching artifact/content/metadata URIs.
- Final automated gate: 152 tests passed with
ResourceWarningpromoted to an error; all Python modules compile andgit diff --checkpasses.