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. (The 7-day window applies only to free sandbox keys.) There are two ways to work with it: pull the archive in bulk, or look one dog up at a time.

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, SP and comment
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.