Docs› Coverage› Pricing› Status› Support›
  1. Home
  2. Documentation
  3. Upcoming races

Greyhound racing API: Upcoming races

Upcoming races

The next races coming up. UK, Ireland and Australia.

Documentation / Racecards

Upcoming races

Race PassArchive PassMCP tool upcoming_races

The next races coming up. Covers the UK, Ireland and Australia.

GEThttps://api.greyhoundracingapi.com/v1/racecards/upcoming

Try it

No key yet? The free key is made in a moment and filled in here for you. Get a free key
GET https://api.greyhoundracingapi.com/v1/racecards/upcoming
Run works once the API is live; the code below works now with the login.

Parameters

NameTypeWhat it does
countrystringLeave out for all three countries.
GBIEAU
pageintegerPage number, from 1. 50 races a page.
cursorstringThe meta.next_cursor from your last call, for the next page.
formatstringThe answer format. Adding .csv to the path does the same as csv.
jsoncsv

Returns

A list of races in data and paging in meta: count, page, per_page, total, total_pages and next_cursor. A field we do not have for a race is null, never left out. See Pagination.

FieldTypeWhat it holds
race_idstringOur id for the race. Stable, safe to store.
trackstringTrack id, as in Tracks.
track_namestringTrack name for display.
countrystringGB, IE or AU.
nointegerRace number at the meeting.
offtimeScheduled start, local to the track, HH:MM.
off_utcdatetimeScheduled start in UTC.
distance_mintegerDistance in metres.
gradestringRace grade, where one is given.
runners[].trapintegerTrap, 1 to 6 (1 to 8 in Australia).
runners[].runnerstringGreyhound name.
runners[].runner_idstringOur id for the greyhound. Stable, safe to store.
runners[].trainerstringTrainer name.

Example answer

A real answer from 6 October 2026, 13:20 UTC, trimmed to one race and three runners.

{
    "data": [
        {
            "race_id": "rc_4mn2frfr",
            "track": "romford",
            "track_name": "Romford",
            "country": "GB",
            "no": 1,
            "off": "14:23",
            "off_utc": "2026-10-06T13:23:00Z",
            "distance_m": 400,
            "grade": "A5",
            "runners": [
                {
                    "pos": null,
                    "trap": 1,
                    "runner": "Abbeyside Comet",
                    "runner_id": "rn_zkaq5asc",
                    "trainer": "M E Wiley",
                    "time": null,
                    "sp": null,
                    "sp_decimal": null
                },
                {
                    "pos": null,
                    "trap": 2,
                    "runner": "Coyote Izzy",
                    "runner_id": "rn_83b9v1vg",
                    "trainer": "M E Wiley",
                    "time": null,
                    "sp": null,
                    "sp_decimal": null
                },
                {
                    "pos": null,
                    "trap": 3,
                    "runner": "My Storm Libby",
                    "runner_id": "rn_w00874ge",
                    "trainer": "K M O'flaherty",
                    "time": null,
                    "sp": null,
                    "sp_decimal": null
                }
            ]
        }
    ],
    "meta": {
        "count": 50,
        "page": 1,
        "per_page": 50,
        "total": 92,
        "total_pages": 2,
        "next_cursor": "cDI",
        "took_ms": 65
    }
}

Errors

StatusCodeWhat to do
400bad_requestA value is not valid, a date is before 2020, or the key was put in the address. The message says which.
401unauthorizedNo key, or the key is wrong, revoked or expired. Check the header.
403upgrade_requiredYour plan does not include this endpoint. plan names the one that does.
422unknown_parameterA parameter this endpoint does not take. The message lists the ones it does.
429rate_limitedToo many calls this minute. Wait for Retry-After.
429quota_exceededToday's allowance is used. It resets at 00:00 UTC.
503server_errorOur side. Not counted against you. Try again shortly, and see status.