Documentation / Tracks

List tracks

GET/v1/tracks

Available on Free Live Live Plus

Every GB, AU and IE greyhound track that has raced in the last two weeks (courses currently running, not the all-time roster) with its region, IANA timezone, active flag, the distances raced there and the grades it has actually carded in the last four weeks.

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

NameInTypeRequiredDescription
ids query string no Fetch a known set in one call — up to 50 ids, dash or comma separated, e.g. ?ids=2765720978-1237493697. Composes with every other filter, and each id costs one call against your rate limit. If any id has no record the whole request is refused with 400 invalid_id naming it, rather than quietly returning the rest. See batch requests.
region query string no Filter by region code: GB, AU or IE.

Request

curl "https://api.greyhoundapi.com/v1/tracks?region=GB" \
  -H "X-API-Key: $GAPI_KEY"
<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/tracks?region=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/tracks?region=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/tracks?region=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/tracks?region=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"])

Response

200 OKapplication/json
{
    "meta": {
        "request_id": "req_8f2ac1",
        "data_as_of": "2026-07-08T13:05:12Z",
        "count": 2,
        "next_cursor": "eyJzIjoiMjAyNi0wNy0wOFQyMDo0NjowMFoifQ"
    },
    "data": [
        {
            "track_id": 1400000014,
            "name": "Romford",
            "slug": "romford",
            "region": "GB",
            "timezone": "Europe/London",
            "active": true,
            "distances": [
                225,
                400,
                575,
                750
            ]
        },
        {
            "track_id": 1610000061,
            "name": "Shepparton",
            "slug": "shepparton",
            "region": "AU",
            "timezone": "Australia/Melbourne",
            "active": true,
            "distances": [
                385,
                450,
                650
            ],
            "grades": [
                "5",
                "FFA",
                "M",
                "T3"
            ]
        }
    ]
}

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.

GET/v1/tracks

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.