Latest results
/v1/results/latestAvailable on Live Live Plus
Results ordered by the moment they reached the pipeline — the polling companion to the WebSocket stream, with a since cursor for gapless catch-up.
Authenticate with your key in the X-API-Key header —
see Authentication. Works with sandbox keys
inside the sandbox data window.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
since |
query | datetime | no | Return results received after this UTC instant. Use the received timestamp of the last result you processed. |
region |
query | string | no | Filter by region code: GB or AU. |
limit |
query | integer | no | Page size, 1–200. Defaults to 50. |
Request
curl "https://api.greyhoundapi.com/v1/results/latest?since=2026-07-08T20%3A00%3A00Z®ion=GB" \
-H "X-API-Key: $GAPI_KEY"<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/results/latest?since=2026-07-08T20%3A00%3A00Z®ion=GB');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('GAPI_KEY')],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response['data']);const res = await fetch('https://api.greyhoundapi.com/v1/results/latest?since=2026-07-08T20%3A00%3A00Z®ion=GB', {
headers: { 'X-API-Key': process.env.GAPI_KEY }
});
if (!res.ok) throw new Error(`GreyhoundAPI ${res.status}`);
const { meta, data } = await res.json();
console.log(meta.data_as_of, data);import { useEffect, useState } from 'react';
export default function Example() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.greyhoundapi.com/v1/results/latest?since=2026-07-08T20%3A00%3A00Z®ion=GB', {
headers: { 'X-API-Key': import.meta.env.VITE_GAPI_KEY }
})
.then((r) => r.json())
.then((body) => setData(body.data));
}, []);
if (!data) return <p>Loading…</p>;
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}Browser code exposes whatever key it ships with — use a sandbox key for prototypes and proxy live keys through your own server in production.
import os
import requests
r = requests.get(
"https://api.greyhoundapi.com/v1/results/latest?since=2026-07-08T20%3A00%3A00Z®ion=GB",
headers={"X-API-Key": os.environ["GAPI_KEY"]},
timeout=10,
)
r.raise_for_status()
body = r.json()
print(body["meta"]["data_as_of"], body["data"])Response
{
"meta": {
"request_id": "req_8f2ac1",
"data_as_of": "2026-07-08T13:05:12Z",
"count": 1,
"next_cursor": "eyJzIjoiMjAyNi0wNy0wOFQyMDo0NjowMFoifQ",
"page": 1,
"per_page": 50,
"total": 1287,
"total_pages": 26,
"next_page": 2,
"prev_page": null
},
"data": [
{
"race_id": 1229082,
"meeting_id": 449422,
"region": "GB",
"track": {
"track_id": 14,
"name": "Romford",
"region": "GB",
"timezone": "Europe/London"
},
"race_number": 12,
"grade": "S1",
"class_letter": "S",
"class_number": 1,
"distance_m": 575,
"race_type": "Flat",
"is_handicap": false,
"going": null,
"field_size": 6,
"scheduled_start": {
"utc": "2026-07-08T20:46:00Z",
"local": "2026-07-08T21:46:00+01:00"
},
"status": "complete",
"off": {
"utc": "2026-07-08T20:47:12Z",
"delay_s": 72
},
"freshness": {
"first_seen": "2026-07-07T05:12:10Z",
"results_received": "2026-07-08T21:03:40Z",
"results_delay_s": 1060
},
"result": {
"positions": [
{
"position": 1,
"trap": 3,
"dog_id": 654595,
"dog_name": "Miami Yeats",
"trainer": {
"trainer_id": 121,
"name": "M E Wiley"
},
"sp": {
"fraction": "5/2",
"decimal": 3.5
},
"btn": {
"raw": null,
"lengths": 0
},
"sectional_s": 4.31,
"run_time_s": 35.42,
"adjusted_time_s": 35.42,
"weight_kg": 34.4,
"comment": "EP, Ld1",
"betfair": {
"selection_id": 84512233,
"win": {
"last": 3.55,
"low": 3.2,
"high": 4.1
},
"lay": {
"last": 3.6,
"low": 3.25,
"high": 4.2
},
"total_volume": 1843.2,
"trade_count": 212,
"last_update": "2026-07-08T20:41:02Z"
}
}
],
"forecast_dividend": "12.40",
"tricast_dividend": "48.12",
"off": {
"utc": "2026-07-08T20:47:12Z",
"delay_s": 72
},
"received": {
"utc": "2026-07-08T21:03:40Z",
"delay_s": 1060
}
}
}
]
}Run it live
A real request from your browser straight to api.greyhoundapi.com
with your own key — nothing is proxied or logged by this page.
Held in this tab only, sent only to the API host. No key yet? Create a free sandbox key — it runs every endpoint against the sandbox data window.
Notes
Ordered by freshness.results_received, not by off-time — that is what makes catch-up gapless after a disconnect. Pairs with the WebSocket stream.