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:
| Field | What it is |
|---|---|
position, trap | Finishing position and trap/box |
sectional_s | Sectional — the split to the first bend |
run_time_s, adjusted_time_s | Overall time, and the going-adjusted time |
btn | Beaten distance (raw, and in lengths) |
sp | Starting price (fractional and decimal) |
betfair | Betfair 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:
| Endpoint | Returns |
|---|---|
GET /dogs/{dog_id}/form | Career form — each past run with position, times, SP and comment |
GET /dogs/{dog_id}/prices | Starting 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}/market | The 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.