---
name: greyhoundracingapi
description: Greyhound racing results and racecards for the UK, Ireland and Australia from greyhoundracingapi.com. Use when an agent needs race results, today's racecards, upcoming races or the list of tracks.
---

# greyhound racing api

Greyhound racing results, racecards and tracks for the UK (GB), Ireland (IE) and Australia (AU), as JSON or CSV. Operated by DeveloperData.net. Factual data only: no tips, ratings or betting advice.

## When to use it

- Use it for: yesterday's or today's results, results on a past date, today's racecards, the next races coming up, track names and distances.
- Do not use it for: horse racing, odds or prices feeds, predictions, live streaming, or countries other than GB, IE and AU.

## Getting access

- Get a free key by signing in with Google at https://greyhoundracingapi.com/free-key/. The key starts `gra_live_`.
- Send it as `Authorization: Bearer <key>` (or `X-API-Key: <key>`). Never put it in the URL: that is refused with `400 bad_request`.
- Base URL: `https://api.greyhoundracingapi.com/v1`. Every endpoint is `GET`. Add `.csv` to a path, or `format=csv`, for CSV.

## The calls

Yesterday's results (every plan):

```
curl -G https://api.greyhoundracingapi.com/v1/results/yesterday -d country=GB -H "Authorization: Bearer $KEY"
```

```json
{"data":[{"race_id":"rc_x41b9","track":"romford","track_name":"Romford","country":"GB","no":7,"off":"19:42","distance_m":400,"grade":"A3",
  "result":[{"pos":1,"trap":6,"runner":"Swift Meadow","runner_id":"rn_8kq2v","trainer":"J Hale","time":29.41,"sp":"5/2"}]}],
 "meta":{"count":48,"next_cursor":null,"took_ms":61}}
```

Other endpoints, same response shape:

| Call | Plans | Notes |
|---|---|---|
| `GET /v1/results/today` | Race Pass, Archive Pass | `since=HH:MM` (UTC) returns only races settled after that time, for polling |
| `GET /v1/results?date=YYYY-MM-DD` | Archive Pass | Any date from 2020-01-01; earlier dates are refused. Page with `cursor` from `meta.next_cursor` |
| `GET /v1/racecards/today` | Race Pass, Archive Pass | Runners under `runners[]` instead of `result[]` |
| `GET /v1/racecards/upcoming` | Race Pass, Archive Pass | The next races coming up |
| `GET /v1/tracks` | all | `track` id, `name`, `country`, `distances_m` |
| `GET /v1/usage` | all | Your plan, calls today and limits; never counted |

Filters on race endpoints: `country` (GB, IE, AU), `track` (a track id such as `romford`), `race` (race number). An unknown parameter is refused with `422 unknown_parameter`.

## MCP server

`https://greyhoundracingapi.com/mcp` (Streamable HTTP, OAuth 2.1 sign-in, or `Authorization: Bearer <key>`). Race Pass and Archive Pass only. Tools: `yesterdays_results`, `todays_results`, `search_results`, `todays_racecards`, `upcoming_races`, `list_tracks`, `my_usage`.

## Limits

| Plan | Price | Data | Per minute / per day |
|---|---|---|---|
| Free key | free | Yesterday's results only | 30 / 75 |
| Race Pass | $29 a month | Today's racecards and results as each race settles | 120 / 20,000 |
| Archive Pass | $79 a month | Live plus every date from 2020 | 240 / 50,000 |

Days reset at 00:00 UTC. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` and `X-Quota-Remaining`. A 5xx is never counted.

## Errors

Every error is `{"error":{"code":"...","message":"...","plan":"(only on 403)","docs":"https://greyhoundracingapi.com/documentation/errors"}}`.

| HTTP | code | Do this |
|---|---|---|
| 400 | `bad_request` | Fix the value named in the message, or move the key to a header |
| 401 | `unauthorized` | Check the key |
| 403 | `upgrade_required` | The plan does not include this endpoint; `plan` names the one that does |
| 404 | `not_found` | Check the path |
| 422 | `unknown_parameter` | Use only the parameters the message lists |
| 429 | `rate_limited` / `quota_exceeded` | Wait for `Retry-After` |
| 503 | `server_error` | Try again shortly; see https://greyhoundracingapi.com/status/ |

## A typical workflow

1. Call `GET /v1/usage` to learn the plan and what it can read.
2. Call `GET /v1/tracks` once and keep the track ids.
3. For results: free key, `GET /v1/results/yesterday`; Race Pass, `GET /v1/results/today` and poll every minute or two with `since`; Archive Pass, `GET /v1/results?date=...` and follow `meta.next_cursor`.
4. On `403 upgrade_required`, tell the user which plan is needed rather than retrying.
5. Show times as given; `off` is the scheduled start.

Full reference: https://greyhoundracingapi.com/documentation/manual.md
