Documentation / Results

Latest results

GET/v1/results/latest

Available 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

NameInTypeRequiredDescription
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&region=GB" \
  -H "X-API-Key: $GAPI_KEY"
<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/results/latest?since=2026-07-08T20%3A00%3A00Z&region=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&region=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&region=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&region=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

200 OKapplication/json
{
    "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.

GET/v1/results/latest

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.