Racing calendar
Not a summary of our coverage: the coverage itself. Thirty days of racing across Great Britain, Australia and Ireland, by track and by day, so you can see exactly what we carry before you build on it.
Coverage
Every meeting in the archive, by track and day. Numbers are races run. This is the coverage itself — not a summary of it — so you can see exactly which tracks are carried and how often they race before you build anything.
| Track | Su13 | Mo14 | Tu15 | We16 | Th17 | Fr18 | Sa19 | Su20 | Mo21 | Tu22 | We23 | Th24 | Fr25 | Sa26 | Su27 | Mo28 | Tu29 | We30 | Th1 | Fr2 | Sa3 | Su4 | Mo5 | Tu6 | We7 | Th8 | Fr9 | Sa10 | Su11 | Mo12 | 30d |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| GBCentral Park | 12 | 12 | 12 | 12 | 13 | 12 | 12 | 12 | 12 | 13 | 12 | 12 | 12 | 12 | 13 | 12 | 12 | 12 | 12 | 13 | 12 | 256 | |||||||||
| GBDoncaster | 9 | 13 | 10 | 22 | 8 | 13 | 9 | 23 | 8 | 13 | 10 | 24 | 9 | 13 | 8 | 24 | 10 | 13 | 239 | ||||||||||||
| GBDunstall Park | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 204 | |||||||||||||
| GBHarlow | 27 | 26 | 27 | 25 | 26 | 27 | 27 | 27 | 26 | 28 | 27 | 27 | 28 | 348 | |||||||||||||||||
| GBHove | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 252 | |||||||||
| GBKinsley | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 204 | |||||||||||||
| GBMonmore | 12 | 12 | 12 | 12 | 24 | 12 | 12 | 12 | 12 | 24 | 12 | 12 | 12 | 12 | 24 | 12 | 12 | 12 | 12 | 24 | 12 | 300 | |||||||||
| GBNewcastle | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 240 | ||||||||||
| GBNottingham | 12 | 11 | 11 | 12 | 12 | 11 | 11 | 12 | 12 | 11 | 11 | 12 | 12 | 11 | 11 | 12 | 12 | 196 | |||||||||||||
| GBRomford | 12 | 12 | 12 | 12 | 24 | 12 | 12 | 12 | 12 | 24 | 12 | 12 | 12 | 12 | 24 | 12 | 12 | 12 | 12 | 24 | 12 | 300 | |||||||||
| GBSheffield | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 8 | 12 | 12 | 12 | 12 | 8 | 12 | 12 | 12 | 12 | 12 | 220 | |||||||||||
| GBStar Pelaw | 9 | 8 | 14 | 9 | 8 | 12 | 9 | 8 | 12 | 12 | 9 | 8 | 13 | 131 | |||||||||||||||||
| GBSunderland | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 264 | ||||||||
| GBTowcester | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 312 | ||||
| GBValley | 14 | 12 | 11 | 12 | 14 | 14 | 12 | 8 | 12 | 12 | 10 | 9 | 11 | 12 | 10 | 9 | 9 | 14 | 14 | 219 | |||||||||||
| GBYarmouth | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 216 | ||||||||||||
| AUBallarat | 14 | 14 | 12 | 12 | 12 | 14 | 12 | 14 | 14 | 13 | 131 | ||||||||||||||||||||
| AUBendigo | 13 | 12 | 13 | 12 | 13 | 12 | 12 | 12 | 12 | 111 | |||||||||||||||||||||
| AUBulli | 11 | 12 | 11 | 10 | 10 | 12 | 66 | ||||||||||||||||||||||||
| AUCannington | 12 | 9 | 10 | 11 | 10 | 11 | 11 | 11 | 85 | ||||||||||||||||||||||
| AUCasino | 10 | 12 | 12 | 12 | 12 | 12 | 70 | ||||||||||||||||||||||||
| AUDubbo | 2 | 9 | 12 | 9 | 10 | 11 | 11 | 9 | 2 | 9 | 3 | 87 | |||||||||||||||||||
| AUGeelong | 11 | 12 | 10 | 10 | 12 | 13 | 12 | 13 | 12 | 105 | |||||||||||||||||||||
| AUGosford | 10 | 2 | 12 | 9 | 3 | 10 | 10 | 2 | 11 | 6 | 6 | 81 | |||||||||||||||||||
| AUGoulburn | 10 | 10 | 9 | 10 | 39 | ||||||||||||||||||||||||||
| AUGrafton | 10 | 1 | 9 | 3 | 8 | 9 | 1 | 10 | 9 | 1 | 61 | ||||||||||||||||||||
| AUGunnedah | 10 | 2 | 9 | 2 | 10 | 2 | 8 | 2 | 45 | ||||||||||||||||||||||
| AUHealesville | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 120 | ||||||||||||||||||||
| AUHorsham | 13 | 9 | 12 | 11 | 13 | 13 | 71 | ||||||||||||||||||||||||
| AUMandurah | 10 | 12 | 11 | 9 | 12 | 10 | 9 | 12 | 10 | 10 | 12 | 10 | 127 | ||||||||||||||||||
| AUMeadows (MEP) | 12 | 12 | 11 | 35 | |||||||||||||||||||||||||||
| AUNortham | 9 | 10 | 9 | 9 | 8 | 45 | |||||||||||||||||||||||||
| AUSale | 11 | 12 | 12 | 12 | 12 | 11 | 12 | 82 | |||||||||||||||||||||||
| AUSandown (SAP) | 11 | 12 | 12 | 10 | 11 | 56 | |||||||||||||||||||||||||
| AUSandown Park | 12 | 12 | 12 | 12 | 48 | ||||||||||||||||||||||||||
| AUShepparton | 14 | 12 | 14 | 13 | 14 | 14 | 13 | 14 | 108 | ||||||||||||||||||||||
| AUThe Meadows | 12 | 12 | 12 | 12 | 48 | ||||||||||||||||||||||||||
| AUTraralgon | 13 | 13 | 13 | 12 | 12 | 63 | |||||||||||||||||||||||||
| AUWagga Wagga | 9 | 2 | 11 | ||||||||||||||||||||||||||||
| AUWarragul | 12 | 12 | 12 | 10 | 12 | 10 | 12 | 12 | 12 | 12 | 116 | ||||||||||||||||||||
| AUWarrnambool | 11 | 12 | 12 | 13 | 10 | 13 | 11 | 13 | 95 | ||||||||||||||||||||||
| AUWentworth Park | 3 | 3 | |||||||||||||||||||||||||||||
| IEClonmel | 12 | 10 | 11 | 10 | 12 | 10 | 12 | 9 | 12 | 98 | |||||||||||||||||||||
| IECurraheen Park | 10 | 10 | 10 | 11 | 9 | 10 | 8 | 11 | 79 | ||||||||||||||||||||||
| IEDerry | 16 | 7 | 7 | 8 | 8 | 46 | |||||||||||||||||||||||||
| IEDundalk | 8 | 10 | 8 | 10 | 8 | 9 | 8 | 8 | 69 | ||||||||||||||||||||||
| IEEnniscorthy | 8 | 7 | 7 | 7 | 8 | 8 | 8 | 7 | 60 | ||||||||||||||||||||||
| IEGalway | 7 | 7 | 8 | 6 | 6 | 7 | 6 | 47 | |||||||||||||||||||||||
| IEKilkenny | 12 | 10 | 12 | 10 | 12 | 10 | 12 | 10 | 88 | ||||||||||||||||||||||
| IELifford | 9 | 13 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 106 | |||||||||||||||||||||
| IELimerick | 8 | 10 | 8 | 8 | 8 | 8 | 9 | 10 | 10 | 79 | |||||||||||||||||||||
| IEMullingar | 10 | 8 | 10 | 9 | 9 | 8 | 9 | 10 | 8 | 10 | 10 | 8 | 109 | ||||||||||||||||||
| IENewbridge | 9 | 8 | 8 | 8 | 33 | ||||||||||||||||||||||||||
| IEShelbourne Park | 7 | 8 | 11 | 9 | 8 | 11 | 8 | 7 | 10 | 8 | 8 | 9 | 104 | ||||||||||||||||||
| IEThurles Park | 11 | 10 | 10 | 8 | 8 | 47 | |||||||||||||||||||||||||
| IETralee | 11 | 10 | 8 | 11 | 10 | 8 | 11 | 9 | 8 | 11 | 9 | 8 | 114 | ||||||||||||||||||
| IEWaterford | 10 | 10 | 10 | 9 | 10 | 10 | 12 | 10 | 81 | ||||||||||||||||||||||
| IEYoughal | 8 | 8 | 8 | 8 | 8 | 8 | 9 | 7 | 7 | 10 | 81 | ||||||||||||||||||||
| All tracks | 144 | 238 | 199 | 244 | 240 | 304 | 308 | 153 | 235 | 190 | 238 | 231 | 303 | 327 | 159 | 234 | 186 | 237 | 236 | 301 | 324 | 139 | 239 | 197 | 245 | 233 | 299 | 300 | 147 | 221 | 7051 |
Coverage is Great Britain, Australia and Ireland. Every track listed here is in the archive with results, times and starting prices; see what we cover for the edges and the fields that are not always present, data freshness for how quickly each arrives, and the endpoint reference for how to query it.
Each track has its own page in the track directory with trap-by-trap win rates, standing records and tonight's card.
The request behind the grid
The table above is a single request. Reconstructing it any other way means asking
/v1/meetings for one date, then the next, then the next — thirty
round trips and thirty lots of paging to answer a question about coverage.
One row per track per day, each carrying how many meetings ran and how many races were in them. Dates are the track's own local date, so an Australian evening card is filed on the day it ran there.
On every paid plan — not held back for Live Plus.
curl -s -G \
"https://api.greyhoundapi.com/v1/meetings/calendar" \
--data-urlencode "date_from=2026-08-05" \
--data-urlencode "region=GB" \
-H "X-API-Key: $GAPI_KEY" \
| jq '.meta.count'$url = 'https://api.greyhoundapi.com/v1/meetings/calendar'
. '?date_from=2026-08-05®ion=GB';
$hdr = ['http' => ['header' => 'X-API-Key: ' . $key]];
$res = json_decode(file_get_contents($url, false,
stream_context_create($hdr)), true);
echo count($res['data']), ' track-days';const url = 'https://api.greyhoundapi.com/v1/meetings/calendar'
+ '?date_from=2026-08-05®ion=GB';
const res = await fetch(url, {
headers: { 'X-API-Key': process.env.GAPI_KEY }
});
const { data } = await res.json();import os, requests
url = 'https://api.greyhoundapi.com/v1/meetings/calendar'
res = requests.get(url, timeout=20,
params={'date_from': '2026-08-05', 'region': 'GB'},
headers={'X-API-Key': os.environ['GAPI_KEY']})
data = res.json()['data']{
"meta": {
"count": 397,
"date_from": "2026-08-05",
"date_to": "2026-09-03"
},
"data": [
{ "date": "2026-09-03", "track": "Romford",
"region": "GB", "meetings": 1, "races": 12 },
{ "date": "2026-09-02", "track": "Harlow",
"region": "GB", "meetings": 2, "races": 26 }
]
}Meetings, races, runners
Every number in the grid above is a count of meetings, and a meeting is a whole night's racing at one track. It is the level almost everyone gets wrong first, because on most days there is exactly one per track — until there are two, and a day that looked like twelve races turns out to be twenty-six.
One card at one track on one local date. Harlow ran two on 2 September, which is why that cell reads 26 rather than 12.
One contest inside a meeting, with its distance, grade, going and scheduled off. Twelve is the usual card; some run eight, some fourteen.
One dog in one race, with trap, trainer, starting price, finishing position, time and sectional where the timing gear recorded it.
Every identifier is stable, so a meeting id from this calendar resolves to the same card tomorrow, next month and next year. That is what makes the archive worth building against — see historical data.
Getting it into your app
Plain HTTPS, JSON, cursor paging and one key in a header. The calendar, the cards, the results and the archive all answer the same way.
Start here →A live socket for the things that change while you watch — prices moving, traps loading, results landing. No polling loop to write or tune.
The stream →We post to your endpoint when a result settles, so nothing on your side has to stay awake waiting for it. Signed, retried, and visible in your dashboard.
Webhooks →That was the hard question. A free key takes about a minute and reaches a rolling seven-day window of the same data — enough to build against before you decide anything.