Racing calendar
/v1/meetings/calendarAvailable on Live Live Plus
Which tracks raced on which days: one row per track per day with the number of meetings and races on each. Coverage as data, in a single call instead of one per day.
Authenticate with your key in the X-API-Key header, or
?key= if your tool cannot set one —
see Authentication. Works with sandbox keys
inside the sandbox data window.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
date_from |
query | date | no | Start of the date range, track-local calendar date (YYYY-MM-DD). See Timezones & dates. |
date_to |
query | date | no | End of the date range, track-local calendar date, inclusive. |
region |
query | string | no | Filter by region code: GB, AU or IE. |
track_id |
query | integer | no | Filter to a single track. Track IDs come from List tracks. |
limit |
query | integer | no | Page size, 1–200. Defaults to 50. |
Request
curl "https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB" \
-H "X-API-Key: $GAPI_KEY"<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('GAPI_KEY')],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response['data']);const res = await fetch('https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB', {
headers: { 'X-API-Key': process.env.GAPI_KEY }
});
if (!res.ok) throw new Error(`GreyhoundAPI ${res.status}`);
const { meta, data } = await res.json();
console.log(meta.data_as_of, data);import { useEffect, useState } from 'react';
export default function Example() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB', {
headers: { 'X-API-Key': import.meta.env.VITE_GAPI_KEY }
})
.then((r) => r.json())
.then((body) => setData(body.data));
}, []);
if (!data) return <p>Loading…</p>;
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}Browser code exposes whatever key it ships with — use a sandbox key for prototypes and proxy live keys through your own server in production.
import os
import requests
r = requests.get(
"https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB",
headers={"X-API-Key": os.environ["GAPI_KEY"]},
timeout=10,
)
r.raise_for_status()
body = r.json()
print(body["meta"]["data_as_of"], body["data"])curl "https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB&key=$GAPI_KEY"<?php
$url = 'https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB' . (str_contains('https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB', '?') ? '&' : '?') . 'key=' . getenv('GAPI_KEY');
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response['data']);const res = await fetch(`https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB&key=$GAPI_KEY`.replace('$GAPI_KEY', process.env.GAPI_KEY));
if (!res.ok) throw new Error(`GreyhoundAPI ${res.status}`);
const { meta, data } = await res.json();
console.log(meta.data_as_of, data);import { useEffect, useState } from 'react';
export default function Example() {
const [data, setData] = useState(null);
useEffect(() => {
fetch(`https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB&key=$GAPI_KEY`.replace('$GAPI_KEY', import.meta.env.VITE_GAPI_KEY))
.then((r) => r.json())
.then((body) => setData(body.data));
}, []);
if (!data) return <p>Loading…</p>;
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}Browser code exposes whatever key it ships with — use a sandbox key for prototypes and proxy live keys through your own server in production.
import os
import requests
r = requests.get(
"https://api.greyhoundapi.com/v1/meetings/calendar?date_from=2026-07-01®ion=GB",
params={"key": os.environ["GAPI_KEY"]},
timeout=10,
)
r.raise_for_status()
body = r.json()
print(body["meta"]["data_as_of"], body["data"])A key in the URL appears in server logs, browser history and anything the link is pasted into. Convenient for a spreadsheet or a quick look; the header is safer everywhere else.
Response
{
"meta": {
"request_id": "req_8f2ac1",
"data_as_of": "2026-07-08T13:05:12Z",
"count": 3,
"date_from": "2026-06-09",
"date_to": "2026-07-08"
},
"data": [
{
"date": "2026-07-08",
"track_id": 1400000014,
"track": "Romford",
"region": "GB",
"meetings": 1,
"races": 12
},
{
"date": "2026-07-08",
"track_id": 1610000061,
"track": "Shepparton",
"region": "AU",
"meetings": 1,
"races": 10
},
{
"date": "2026-07-07",
"track_id": 1400000014,
"track": "Romford",
"region": "GB",
"meetings": 2,
"races": 24
}
]
}Run it live
A real request from your browser straight to api.greyhoundapi.com
with your own key — nothing is proxied or logged by this page.
Held in this tab only, sent only to the API host. No key yet? Create a free sandbox key — it runs every endpoint against the sandbox data window.
Notes
Dates are each track's OWN local date, so an Australian evening card lands on the day it ran locally rather than the UTC day it started. Only days with racing appear — a missing day means nothing ran, which is the point of the endpoint. Defaults to the last 30 days; date_from reaches back as far as the archive of daily counts goes, currently 400 days. The same view in a browser is the racing calendar, and What we cover explains the edges.