Documentation / Guides

Race Day plan overview

Today and yesterday, with the prices on: what the Race Day plan covers, every endpoint it reaches, and what still needs Live.

Race Day · $49/month

Today and yesterday, with the money on.

Every card, every result and every price for the two days still trading. It is the plan for screens, bots and bet-placement tools that only ever ask about racing happening now. It is not an archive plan: anything older than yesterday is refused, with the window named, rather than quietly returning less.

The window

Counted at each track in its own timezone, so an Australian card comes back whole. The floor moves at local midnight: a race you read at 23:55 can be outside the window five minutes later.

Before yesterdayRefused, with the date asked for and the plan that carries it
YesterdayCards, results, prices, weights, weather, dividends
TodayCards from publication, results as they land, live prices
Scheduled aheadCards only, since the racing has not happened

What it adds to a free key

This is the whole argument for the plan. A free key already reads these two days. What it cannot read is the money.

Race day On this plan

  • Starting prices, fractional and decimal
  • Betfair back and lay, with matched amounts
  • Runner weights and handicap marks
  • Race weather, hour by hour
  • Forecast and tricast dividends
  • The results stream and webhooks

Still the Live plan

  • Any racing before yesterday
  • A dog's form and past runs
  • Odds history and price movement
  • Trainer, dog and owner statistics
  • Sire and dam breeding records
  • Bulk archive download

Every endpoint on the plan

20 REST endpoints, plus the results stream and webhooks. Each links to its own page, with parameters and a sample response.

EndpointWhat it answersPlan
GET /v1/racecards/today Today's racecardsRace day
GET /v1/racecards/upcoming Upcoming racesRace day
GET /v1/races Search racesRace day
GET /v1/races/{race_id} Get a raceRace day
GET /v1/races/{race_id}/runners Race runnersRace day
GET /v1/races/{race_id}/result Get a race resultRace day
GET /v1/races/{race_id}/status Race status & freshnessRace day
GET /v1/races/{race_id}/market Race market summaryRace day
GET /v1/results/today Today's resultsRace day
GET /v1/results/yesterday Yesterday's resultsRace day
GET /v1/results/latest Latest resultsRace day
GET /v1/tracks List tracksRace day
GET /v1/tracks/{track_id} Get a trackRace day
GET /v1/tracks/{track_id}/races Races at a trackRace day
GET /v1/tracks/{track_id}/stats Track statisticsRace day
GET /v1/status Pipeline statusRace day
GET /v1/coverage Coverage ledgerRace day
GET /v1/usage Your usageRace day
GET /v1/archive All statisticsRace day
GET /v1/reference Reference dataRace day
WSS results stream Results and status changes as they settleRace day
Webhooks A POST to your URL when a result landsRace day

What a refusal looks like

Asking for older racing is answered rather than ignored: the date asked for, the window that applies, and the plan that carries it.

403 Forbiddenapplication/json
{
  "error": {
    "code": "outside_plan_window",
    "message": "Race Day covers today and yesterday (2026-09-22 onward). 2026-09-15 needs the Live plan, which carries the full archive.",
    "your_plan": "race_day",
    "required_plan": "live",
    "window": { "from": "2026-09-22", "to": "upcoming" },
    "upgrade_url": "https://greyhoundapi.com/account"
  }
}
If you were planning to download the archive, this is the wrong plan. Race Day holds two days at a time and nothing behind them, so a backfill, a model trained on past form, or a study of one track across a season all need Live. Moving up keeps the same key: the history and the extra endpoints start answering on the next request, with nothing to re-integrate.