Documentation / Racecards
Upcoming races
The next races coming up. Covers the UK, Ireland and Australia.
GEThttps://api.greyhoundracingapi.com/v1/racecards/upcomingTry 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/upcomingRun works once the API is live; the code below works now with the login.
Parameters
| Name | Type | What it does | |
|---|---|---|---|
country | string | Leave out for all three countries. GBIEAU | |
page | integer | Page number, from 1. 50 races a page. | |
cursor | string | The meta.next_cursor from your last call, for the next page. | |
format | string | The 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.
| Field | Type | What it holds |
|---|---|---|
race_id | string | Our id for the race. Stable, safe to store. |
track | string | Track id, as in Tracks. |
track_name | string | Track name for display. |
country | string | GB, IE or AU. |
no | integer | Race number at the meeting. |
off | time | Scheduled start, local to the track, HH:MM. |
off_utc | datetime | Scheduled start in UTC. |
distance_m | integer | Distance in metres. |
grade | string | Race grade, where one is given. |
runners[].trap | integer | Trap, 1 to 6 (1 to 8 in Australia). |
runners[].runner | string | Greyhound name. |
runners[].runner_id | string | Our id for the greyhound. Stable, safe to store. |
runners[].trainer | string | Trainer 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
| Status | Code | What to do |
|---|---|---|
| 400 | bad_request | A value is not valid, a date is before 2020, or the key was put in the address. The message says which. |
| 401 | unauthorized | No key, or the key is wrong, revoked or expired. Check the header. |
| 403 | upgrade_required | Your plan does not include this endpoint. plan names the one that does. |
| 422 | unknown_parameter | A parameter this endpoint does not take. The message lists the ones it does. |
| 429 | rate_limited | Too many calls this minute. Wait for Retry-After. |
| 429 | quota_exceeded | Today's allowance is used. It resets at 00:00 UTC. |
| 503 | server_error | Our side. Not counted against you. Try again shortly, and see status. |