Racing calendar

Every meeting.Every day.Three regions.

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.

58tracks
645meetings
7,051races
Last 21 daysraces run, by track
One meeting Two or more No racing Today

Coverage

Racing calendar

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.

58 tracks · 645 meetings · 30 days
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
No racing One meeting Two or more Dates are the track's own local date.

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

Thirty days, one call.

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&region=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&region=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']
200 OKapplication/json
{
  "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

A meeting is a card, not a race.

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.

  1. 01

    Meeting

    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.

    GET /v1/meetings

  2. 02

    Race

    One contest inside a meeting, with its distance, grade, going and scheduled off. Twelve is the usual card; some run eight, some fourteen.

    GET /v1/races/{id}

  3. 03

    Runner

    One dog in one race, with trap, trainer, starting price, finishing position, time and sectional where the timing gear recorded it.

    GET /v1/races/{id}/runners

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

Poll it, stream it, or have it pushed.

REST

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 →

WebSocket

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 →

Webhooks

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 →

You already know what we cover.

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.