Documentation / Guides

Historical data

What history GreyhoundAPI holds, which detail lives inside results versus dedicated endpoints, and how to bulk-import the archive for analysis or model training.

A live key sees the full archive — every race, runner and result on record, with no rolling window. (Free sandbox keys see yesterday, today and ahead only.) There are two ways to work with it: pull the archive in bulk, or look one dog up at a time.

Full means every race we hold, which is not every race that runs — see What we cover for the regions, and the racing calendar for which tracks appear on which days.

Most detail already lives in the result

You rarely need to stitch endpoints together. Each finisher in a result already carries its timing, price and running detail, so a single pass over /results gives you almost everything at once:

FieldWhat it is
position, trapFinishing position and trap/box
sectional_sSectional — the split to the first bend
run_time_s, adjusted_time_sOverall time, and the going-adjusted time
btnBeaten distance (raw, and in lengths)
spStarting price (fractional and decimal)
betfairBetfair market summary

Greyhound racing records a single sectional — the split to the first bend — not a series of per-section splits as in horse racing. So sectional_s is the split figure; there is nothing more granular, which is the nature of the sport rather than a gap in the data.

Bulk import — walk the results archive

The efficient way to build an analysis set or a training corpus is to page /results across a date range and follow the cursor. Narrow it with region, track, dog_id, trainer_id or owner_id as needed.

curl "https://api.greyhoundapi.com/v1/results?date_from=2024-01-01&date_to=2024-12-31&limit=200" \
  -H "X-API-Key: $GAPI_KEY"

# then follow meta.next_cursor until it is absent:
curl "https://api.greyhoundapi.com/v1/results?date_from=2024-01-01&date_to=2024-12-31&limit=200&cursor=..." \
  -H "X-API-Key: $GAPI_KEY"

Use limit=200 and the cursor — not page numbers — for a full pull; see Pagination. Keep an eye on your rate limits and back off on a 429. For the racecard side of the archive (entries rather than results), /races pages the same way.

One dog at a time

When you want a single animal's history rather than the whole archive, these return it directly, with no client-side joining:

EndpointReturns
GET /dogs/{dog_id}/formCareer form — each past run with position, times and SP
GET /dogs/{dog_id}/pricesStarting price and Betfair for each of the dog's runs
GET /dogs/{dog_id}/head-to-head/{rival_id}Every race the two dogs contested, who finished ahead each time, and a career summary for both
GET /races/{race_id}/marketThe Betfair market for one race

The same career form is also reachable by filtering /results with dog_id, so for a large model you can usually stay on the bulk endpoint and skip the per-dog calls entirely.