GB & AU · REST + WebSocket + Webhook
The greyhound racing API for Great Britain and Australia. Racecards, results, sectionals, starting prices and Betfair markets, plus dogs, trainers, tracks and breeding — 38 endpoints, one clean envelope, official SDKs.
No card to start · 38 endpoints · GB + AU
$ curl https://api.greyhoundapi.com/v1/races/4827193056 \
-H "X-API-Key: $GREYHOUNDAPI_KEY"
{
"meta": { "data_as_of": "2026-07-08T14:03Z", "count": 1 },
"data": {
"race_id": 4827193056, "track": "Romford", "distance_m": 400,
"status": "complete",
"runners": [
{ "trap": 1, "dog": "Miami Yeats", "position": 1, "sp": "5/2" },
{ "trap": 2, "dog": "Full Monty", "position": 2 }
]
}
}
import { GreyhoundAPI } from "@greyhoundapi/sdk";
const gapi = new GreyhoundAPI({ apiKey });
// today's GB card, then one race
const card = await gapi.racecards.today({ region: "GB" });
const race = await gapi.races.get(4827193056);
console.log(race.runners[0].dog); // "Miami Yeats"
from greyhoundapi import GreyhoundAPI
gapi = GreyhoundAPI(api_key=key)
# today's GB card, then one race
card = gapi.racecards_today(region="GB")
race = gapi.race(4827193056)
print(race["runners"][0]["dog"]) # "Miami Yeats"
use GreyhoundApi\Client;
$gapi = new Client($key);
// today's GB card, then one race
$card = $gapi->racecardsToday(["region" => "GB"]);
$race = $gapi->race(4827193056)["data"];
echo $race["runners"][0]["dog"]; // "Miami Yeats"
The signature
Six traps, one lure, a fixed distance — greyhound racing is a tidy sport, and the feed matches it. Every race comes back in the same shape, with measured freshness and no surprises, whether it ran at Romford tonight or Wentworth Park last year.
By the numbers
Coverage across Great Britain and Australia, measured in the open and updated continuously.
Counted from the live table, not a marketing figure.
The same query behind /v1/races — what you see here is
what the endpoint returns.
Why this feed
Every race carries its lifecycle status and the exact moment its result reached the pipeline. Delays are measured and published on the status page.
UTC everywhere, rendered track-local, with date parameters resolved per track — a Sydney "today" and a London "today" both behave exactly as you'd expect.
Career form, price history, trap statistics and track records, recomputed nightly from published results — not just today's card.
Subscribe to results, status changes and card updates over WebSocket, with a 15-minute replay window so you never miss an event.
The full surface
Everything the feed exposes — racecards to results, dogs to breeding, markets
to the live stream — in a single consistent shape, filterable by region=GB or
region=AU across every one.
Crowd-sourced, not scraped
GreyhoundAPI isn't a scraper pointed at someone else's results page.
It's an open, crowd-sourced database — cards and results captured by people trackside and kept current by a community of updaters, with every entry gate-kept and checked by us before it goes live.
By people at the meeting, as it happens.
A community of updaters keeps cards and results moving.
Every entry checked before it goes live.
One clean shape across GB and AU, stamped and streamed.
data_as_of and per-race freshness stamps on every responseOpen data, built by people, and looked after so it stays accurate. Every entry on the right is something you can check for yourself in a response.
See how freshness is stampedLive Plus · statistics & AI
Results tell you the past. The three statistics endpoints turn that archive into splits — by distance, trap, track, grade and going, with best and average winning times in each. One call answers a question that would otherwise be a thousand result rows and your own group-by.
Career splits for one greyhound: strike rate by distance, trap, track, grade and going, with best and average winning times in each.
How a yard performs at a given track, over a rolling window you choose —
?months= up to 60, or pin it
to one course with ?track_id=.
The same splits, plus by_trainer
— the question only an owner thinks to ask: which yards is this ownership actually
winning with.
// GET /v1/trainers/118/stats?months=12 { "trainer_id": 118, "name": "M E Wiley", "window_months": 12, "overall": { "runs": 1887, "wins": 342, "win_pct": 18.12, "place_pct": 52.52 }, "by_track": [ { "track": "Romford", "runs": 1831, "win_pct": 18.30 }, { "track": "Central Park", "runs": 43, "win_pct": 13.95 } ], "by_distance": [ { "distance_m": 400, "runs": 1687, "win_pct": 18.02, "best_time_s": 23.64 } ], "by_trap": [ { "trap": 1, "runs": 370, "win_pct": 24.05 } ] }
Splits are the shape a language model can actually reason over. Raw results burn context and force the model to do arithmetic it’s bad at; a pre-aggregated split is a fact it can quote. We built two things on our own endpoints to show what that looks like.
An agent reads tonight’s card, pulls the splits for every runner and commits to a verdict ahead of the off. Then the result lands and you see whether it was right.
Plain English in, named tool calls out — you can see exactly which endpoints it reached for to answer. Point it at your own key and it runs on your quota, not ours.
What you build
It's raw data — what you make of it is yours. A few things people wire it into:
Career form, sectionals, run and adjusted times and trap stats — the inputs for your own model, updated nightly from published results.
/dogs/{id}/form/races/{id}/runners/tracks/{id}/statsBetfair market summaries, starting prices and implied moves alongside the result, so your dashboard shows price and outcome together.
/races/{id}/market/dogs/{id}/prices/results/latestPush results and status changes into Slack, Discord or your own service the moment a race settles — no polling, no missed jumps.
wss://…/v1/stream/racecards/upcomingThe full archive with head-to-heads and historical prices, in one shape, ready to pull into a notebook and test an idea against.
/races/dogs/{id}/head-to-head/{rival}/resultsStart here
Paste your key and go — these four return the shape everything else follows.
/v1/races/{race_id}
01
Full detail for one greyhound race: track, grade, distance, going, scheduled and official off-times, lifecycle status, freshness metadata and the complete runner line-up.
Open in docs →/v1/racecards/today
02
Every greyhound racecard scheduled today in Great Britain and Australia, resolved per track-local calendar day, with runners, traps, grades and start times.
Open in docs →/v1/results/latest
03
Results ordered by the moment they reached the pipeline — the polling companion to the WebSocket stream, with a since cursor for gapless catch-up.
Open in docs →/v1/dogs/{dog_id}/head-to-head/{rival_id}
04
Compare two greyhounds directly: shared races, who finished ahead and how often, plus each dog's career record — the factual rivalry view.
Open in docs →A free key gives you the race & track endpoints against a rolling seven-day window — enough to build and evaluate. When you need live-day data, the full archive and the stream, one plan covers it.