The circuit as files
Downloads
Every card, field, weighting, seed and result, in two files built from the same rows that render the pages. Use them, cite the paper.
- 72CSV rows
- 25Columns
- 21Cards in the JSON
- 25 Oct 2026As at
The circuit publishes itself. Both files below are written by tools/build-data.php from the same rows that render every card, profile and standings table on this site, which is why the row count in the header is a count and not a claim. Generated on the circuit clock of 25 October 2026, covering 19 Oct to 28 Oct 2026.
Circuit rows carry a day offset rather than a frozen date, so the published programme moves with the clock and a file built tomorrow carries tomorrow's dates. That is why the generation date is printed beside the links instead of inside the filename.
The two files
CSV and JSON · as at 25 Oct 2026
| File | Format | What it holds | Size |
|---|---|---|---|
| circuit-results.csv | CSV, UTF-8 | One row per runner per resulted race: 72 rows across 8 cards, 25 columns, header row first. | 16 KB |
| circuit.json | JSON, UTF-8 | The whole published programme: 21 cards — 13 still to run and 8 resulted — with 10 venues and the season aggregates. | 313 KB |
Scroll the table sideways to see every column.
Prices on this page are the draw weighting in another notation. They are reference figures published with the card, not odds available anywhere, and not a betting recommendation.
What is in the CSV
25 columns, in file order
| # | Column | What it holds |
|---|---|---|
| 1 | draw_id | Identifier of the draw that produced the race, as printed on the card — venue code, date and race number. |
| 2 | date | Race date on the circuit clock, ISO 8601. Circuit rows carry a day offset, so this is resolved at build time, not stored. |
| 3 | time | Scheduled start, 24-hour, Australia/Melbourne. |
| 4 | venue | Venue name. The profile is at racecourses/<slug>.php. |
| 5 | code | Thoroughbred, Harness, Greyhound or Jumps. |
| 6 | class | Feature, Class A, Class B, Class C, Maiden or Trial. There are no Group grades on this circuit and the column never carries one. |
| 7 | distance | Race distance in metres, as the card prints it. |
| 8 | race | Race name. |
| 9 | race_slug | Slug of the race. The card is at races/<race_slug>.php. |
| 10 | field_size | Declared field. Fixed at publication, so it never disagrees with the runner count. |
| 11 | book | The book: every runner's implied percentage summed. Over 100 by the engine's margin. |
| 12 | seed | The seed the draw ran on. With the weighting column it reconstructs the race. |
| 13 | engine | Engine build that produced the draw, currently GP-Draw 4.2. |
| 14 | no | Saddlecloth number. |
| 15 | runner | Runner name. |
| 16 | runner_slug | Slug of the runner. The profile is at horses/<runner_slug>.php. Empty where a runner has no profile page. |
| 17 | rider | Driver for harness, jockey for the gallops, empty for greyhounds. |
| 18 | trainer | Trainer name. |
| 19 | weight | Numbers held of the 1,000 in the draw. This is the runner's chance, and it is the only column the result depends on. |
| 20 | true_pct | The weighting as a percentage of the 1,000, one decimal. Before the margin. |
| 21 | odds | Reference price, decimal, two places. The weighting in another notation, shaded by the margin. Not odds available anywhere. |
| 22 | implied | Percentage implied by the reference price — 100 divided by the price. This is the column that sums to the book. |
| 23 | finish | Finishing position. Empty for a runner outside the published finish order. |
| 24 | margin | Margin to the runner in front. The winner's cell carries an em dash. |
| 25 | winning_time | The winner's time, or mile rate for a harness race. One figure per race, repeated on each of its rows. |
Scroll the table sideways to see every column.
Four columns are the ones nobody else prints: weight, true_pct, seed and book. Between them they are the whole mechanism. A runner holding 309 of the 1,000 numbers wins 30.9 per cent of the time, the seed says which draw ran, and the book says how far the published prices sit above the honest percentages. How a virtual race is decided works the arithmetic through on a real card.
What is in the JSON
8 top-level keys
| Key | Type | What it holds |
|---|---|---|
| generated | string | ISO 8601 timestamp of the build. |
| engine | string | Engine build, currently GP-Draw 4.2. |
| today | string | The circuit date the day offsets were resolved against. |
| licence | string | The licence line, repeated in the file so a copy carries it. |
| note | string | What the prices are, repeated in the file for the same reason. |
| venues | array | 10 venues: shape, surface, circumference, straight, rail, cycle, cadence, field limits and distances. |
| races | array | 21 cards, each with its field, weighting table, seed, book, resolved date, status and — where it has run — its finish order, margins and dividends. |
| stats | object | Career and season aggregates for the people and runners on the circuit. |
Scroll the table sideways to see every column.
A card in races carries its runners as an array in saddlecloth order, each with the same weighting and price figures the CSV holds, plus the comment the form desk attached. A resulted card also carries result.finish, result.drawn_order and result.dividends. Nothing in either file is money: there is no prizemoney on this circuit and no dividend was ever paid, so no field carries an amount.
Licence
One line
Free to use with attribution to Gallop Post (galloppost.com). Use it, cite the paper. Reproduce it, chart it, feed it to a model, check our arithmetic against it, publish what you find — name Gallop Post and link the page you took it from, and that is the whole obligation.
Two things the licence cannot give you, because they are not ours to give: the files describe a simulation and nothing in them is a record of a real animal, a real meeting or a real market; and the prices in them are the draw weighting in another notation, not odds available anywhere. Anyone republishing them should carry that sentence with them.
Why this page is unusual
The one claim this paper makes
No commercial virtual racing product publishes its results in a machine-readable form. The supplier that owns the feed, 49s.co.uk, ships its results and racecards as a JavaScript application that renders nothing without a browser, and its data host answered an unauthenticated request for the latest results with a 403. The affiliate aggregators that exist because that data is hard to find publish no API, no CSV and no archive: betvirtual.co offers a results date picker that reaches 2025 and nothing earlier, and portmanparkresults.com promises finishing orders, winning margins and jockey statistics across three pages that carry no race data at all. The one site that said why kept no archive on purpose — "Results shown refer to today's races and are therefore cleared at midnight each day", from the archived results index at horseracingbuzz.net, which now answers with a 500 (desk survey of every virtual racing site then online, read 18 October 2026).
So there is no dataset of virtual racing results anywhere, which is an odd thing to be able to write about a product that has run every few minutes on shop screens for twenty years. This circuit is a simulation and makes no claim to stand in for theirs. What it can do is show what the published form of one looks like: the weighting beside the price, the seed beside the result, and the whole programme in two files that open in a spreadsheet.
If a figure on a page disagrees with the same figure in a file, that is a fault and the desk wants to hear about it — [email protected], or the contact form under "Data request" for a cut that is not in them. How corrections are handled is in the editorial policy.