The measured shape of British & Irish racing
84 courses measured so far from open geodata — track geometry from OpenStreetMap, terrain from Copernicus EU-DEM. Total climb per circuit, undulation, elevation range, the position and severity of every turn. Measured, not quoted.
It's free, under an open licence. Download it, build on it, republish it — just credit the sources.
What the measurements show
Everyone in racing "knows" Epsom is a rollercoaster and Chester is a wall-of-death. The dataset puts numbers on the folklore — and occasionally disagrees with it.
Height difference between each course's lowest and highest points.
| Rank | Course | Elevation range (m) |
|---|---|---|
| 1 | Chepstow | 46.6 m |
| 2 | Epsom | 43.3 m |
| 3 | Goodwood | 35.6 m |
| 4 | Salisbury | 33.8 m |
| 5 | Towcester | 32.7 m |
| 6 | Clonmel | 32.4 m |
| 7 | Ffos Las | 29.2 m |
| 8 | Pontefract | 27.3 m |
| 9 | Beverley | 27.1 m |
| 10 | Wexford | 27.0 m |
| Rank | Course | Elevation change (m/km) |
|---|---|---|
| 1 | Tramore | 13.8 m/km |
| 2 | Chepstow | 12.9 m/km |
| 3 | Epsom | 12.2 m/km |
| 4 | Towcester | 11.4 m/km |
| 5 | Wexford | 10.6 m/km |
| 6 | Goodwood | 10.5 m/km |
| 7 | Hexham | 10.3 m/km |
| 8 | Sligo | 10.3 m/km |
| 9 | Plumpton | 10.0 m/km |
| 10 | Cartmel | 9.8 m/km |
Shortest complete circuits — closed loops only.
| Rank | Course | Circuit length (m) |
|---|---|---|
| 1 | Chester | 1658 m |
| 2 | Sligo | 1720 m |
| 3 | Fakenham | 1723 m |
| 4 | Tramore | 1755 m |
| 5 | Kilbeggan | 1809 m |
| 6 | Plumpton | 1830 m |
| 7 | Newton Abbot | 1913 m |
| 8 | Roscommon | 1932 m |
| 9 | Tralee | 1961 m |
| 10 | Killarney | 1989 m |
| Rank | Course | Longest straight (m) |
|---|---|---|
| 1 | Chepstow | 1820 m |
| 2 | Ascot | 1730 m |
| 3 | Yarmouth | 1690 m |
| 4 | Doncaster | 1650 m |
| 5 | Newbury | 1640 m |
| 6 | Newcastle-AW | 1640 m |
| 7 | Newmarket-July | 1330 m |
| 8 | Cork | 1290 m |
| 9 | Redcar | 1280 m |
| 10 | Epsom | 1260 m |
The shape of every course
Elevation sampled around each circuit, drawn to a shared vertical scale — flat tracks read flat. Curves are stored for 83 of the 84 measured courses so far; the rest are being backfilled.
| Course | Elevation range (m) |
|---|---|
| Aintree | 14.9 |
| Ascot | 23.4 |
| Ayr | 12.6 |
| Ballinrobe | 13.9 |
| Bangor-on-Dee | 3.1 |
| Bath | 16.2 |
| Bellewstown | 8.7 |
| Beverley | 27.7 |
| Carlisle | 22.2 |
| Cartmel | 19.1 |
| Catterick | 10.3 |
| Chelmsford-AW | 9.6 |
| Cheltenham | 22.6 |
| Chepstow | 47.8 |
| Chester | 8.0 |
| Clonmel | 32.9 |
| Cork | 2.6 |
| Doncaster | 7.8 |
| Down Royal | 9.7 |
| Downpatrick | 12.4 |
| Dundalk-AW | 4.6 |
| Epsom | 45.2 |
| Exeter | 24.5 |
| Fairyhouse | 11.7 |
| Fakenham | 6.1 |
| Ffos Las | 31.5 |
| Fontwell | 16.9 |
| Galway | 19.5 |
| Goodwood | 38.7 |
| Gowran Park | 22.1 |
| Hamilton | 23.0 |
| Haydock | 14.3 |
| Hereford | 12.1 |
| Hexham | 27.3 |
| Huntingdon | 7.9 |
| Kempton-AW | 7.3 |
| Kilbeggan | 8.0 |
| Killarney | 9.3 |
| Leicester | 15.8 |
| Leopardstown | 25.5 |
| Limerick | 27.2 |
| Lingfield | 8.5 |
| Listowel | 4.2 |
| Ludlow | 9.7 |
| Market Rasen | 10.9 |
| Musselburgh | 2.9 |
| Naas | 14.8 |
| Navan | 17.7 |
| Newbury | 15.4 |
| Newcastle-AW | 15.3 |
| Newmarket-July | 13.1 |
| Newton Abbot | 4.2 |
| Nottingham | 12.3 |
| Perth | 4.1 |
| Plumpton | 19.5 |
| Pontefract | 27.8 |
| Punchestown | 15.4 |
| Redcar | 8.1 |
| Ripon | 4.1 |
| Roscommon | 16.0 |
| Salisbury | 35.0 |
| Sandown | 23.1 |
| Sedgefield | 6.2 |
| Sligo | 22.8 |
| Southwell-AW | 5.1 |
| Stratford | 4.0 |
| Taunton | 15.1 |
| Thirsk | 5.6 |
| Thurles | 11.6 |
| Tipperary | 9.5 |
| Towcester | 33.5 |
| Tralee | 16.1 |
| Tramore | 26.7 |
| Uttoxeter | 10.0 |
| Warwick | 15.5 |
| Wetherby | 9.5 |
| Wexford | 27.5 |
| Wincanton | 9.6 |
| Windsor | 6.8 |
| Wolverhampton-AW | 5.4 |
| Worcester | 7.5 |
| Yarmouth | 3.9 |
| York | 8.5 |
What's in the dataset
One row per measured course — 84 courses, dataset v2026.07.
The dataset covers courses with racing in our corpus since 1988, including Towcester, which closed in 2018. Where one venue races under more than one course record (turf and all-weather eras, renamed venues), the circuit is measured once and attributed to the record with the venue's most recent racing — never duplicated.
Not measured yet: the Curragh, Brighton and Laytown can't currently be traced from OpenStreetMap (Laytown is raced on a beach, so it may never be), and Kelso's trace is awaiting re-mapping. If you improve the OpenStreetMap coverage of any of these tracks, we'll measure them — the pipeline is sitting ready.
| Field | Meaning |
|---|---|
circuitLengthM | Measured circuit length (or track length for open, non-looping courses) |
turnCount / turns[] | Every turn: position, angle, radius, severity (Tight <150 m radius, Moderate <300 m, Sweeping otherwise) |
longestStraightM | Longest straight |
totalClimbM | Total climb per circuit |
undulationIndexMPerKm | Metres of elevation change per km — the "bumpiness" number |
elevationRangeM | Height difference between the course's lowest and highest points |
elevationProfile[] | Elevation sampled around the circuit — the course's shape |
Positions are metres from the survey origin, not the winning post. Full conventions ship in the data dictionary inside the download.
Download
One zip: course-topology.csv (one row per course), course-topology.json (full structure, including turns and elevation profiles) and a data dictionary with the conventions and licence. Generated live from the same data as the API — it can't go stale.
Or take it straight from the API — no key required:
curl https://api.veredusanalytics.com/api/v1/open-data/course-topologyQuickstart
Five lines to the steepest courses in Britain and Ireland:
import pandas as pd
import requests
data = requests.get("https://api.veredusanalytics.com/api/v1/open-data/course-topology").json()
df = pd.json_normalize(data["courses"])
print(df.nlargest(5, "topology.elevationRangeM")[["name", "topology.elevationRangeM"]])How it was measured
Track centrelines are extracted from OpenStreetMap geometry, resampled, and draped over Copernicus EU-DEM terrain elevation. Turns are detected from curvature; severity is classified by radius. No figures are copied from courses' own materials — everything is computed from the geodata, which is why we say measured, not quoted.
Licence & attribution
Licence: ODbL 1.0 (Open Database Licence). You may copy, redistribute, and build on this dataset, including commercially, provided you attribute and share derived databases alike.
Contains data © OpenStreetMap contributors (ODbL) and Copernicus EU-DEM. Please attribute: "Course topology data © Veredus Analytics, from OpenStreetMap and Copernicus EU-DEM, under ODbL."
Full licence details: Data licences
More where this came from
A data insight most days — measurements, league tables, the point-in-time picture behind each race. No tips, ever.
This dataset is the free slice of Veredus Analytics. The rest is 178 point-in-time features per runner across 530,000+ UK & Irish races since 1988 — in the browser from £14.99/mo, or over the API.
