Sire statistics
/v1/sires/{sire_id}/statsAvailable on Live Plus only
A Live key reaches the other 42 endpoints and
receives 403 upgrade_required here. Compare plans
How a sire's offspring run: strike rate, wins against the market, early pace and debut wins, whole and split by region, distance, trap, age and track.
Authenticate with your key in the X-API-Key header, or
?key= if your tool cannot set one —
see Authentication. Works with sandbox keys
inside the sandbox data window.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
sire_id |
path | integer | yes | The sire identifier. It is the sire_id on every row of Sires, and it stays the same from one weekly rebuild to the next. |
Request
curl "https://api.greyhoundapi.com/v1/sires/2503556926/stats" \
-H "X-API-Key: $GAPI_KEY"<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/sires/2503556926/stats');
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/sires/2503556926/stats', {
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/sires/2503556926/stats', {
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/sires/2503556926/stats",
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"])curl "https://api.greyhoundapi.com/v1/sires/2503556926/stats?key=$GAPI_KEY"<?php
$url = 'https://api.greyhoundapi.com/v1/sires/2503556926/stats' . (str_contains('https://api.greyhoundapi.com/v1/sires/2503556926/stats', '?') ? '&' : '?') . 'key=' . getenv('GAPI_KEY');
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response['data']);const res = await fetch(`https://api.greyhoundapi.com/v1/sires/2503556926/stats?key=$GAPI_KEY`.replace('$GAPI_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/sires/2503556926/stats?key=$GAPI_KEY`.replace('$GAPI_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/sires/2503556926/stats",
params={"key": os.environ["GAPI_KEY"]},
timeout=10,
)
r.raise_for_status()
body = r.json()
print(body["meta"]["data_as_of"], body["data"])A key in the URL appears in server logs, browser history and anything the link is pasted into. Convenient for a spreadsheet or a quick look; the header is safer everywhere else.
Response
{
"meta": {
"request_id": "req_8f2ac1",
"data_as_of": "2026-07-08T13:05:12Z",
"coverage": {
"counted": [
{
"region": "GB",
"years": [
2018,
2019,
2020,
2021,
2022,
2023,
2024,
2025,
2026
]
},
{
"region": "IE",
"years": [
2026
]
}
],
"not_counted": [
{
"region": "AU",
"years": [
2022,
2023,
2024,
2025,
2026
],
"known_pct": {
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0
},
"reason": "No sire or dam is held for these dogs."
},
{
"region": "IE",
"years": [
2019,
2020,
2021,
2022,
2023,
2024,
2025
],
"known_pct": {
"2019": 0,
"2020": 0,
"2021": 0.2,
"2022": 1.6,
"2023": 7.1,
"2024": 22.6,
"2025": 60.3
},
"reason": "Breeding is on record for only part of these fields."
}
],
"rule": "A region's year is counted once breeding is on record for 95% of its runs. It is measured again at every build, so a year joins by itself.",
"built_at": "2026-09-22T08:56:36+00:00",
"rebuilt": "weekly"
}
},
"data": {
"sire_id": 2503556926,
"name": "Droopys Sydney",
"kind": "sire",
"offspring": 2917,
"active_offspring": 427,
"first_run": "2018-02-17",
"last_run": "2026-09-21",
"overall": {
"runs": 120813,
"wins": 23459,
"win_pct": 19.42,
"places": 67051,
"place_pct": 55.5,
"priced_runs": 120657,
"priced_wins": 23430,
"expected_wins": 22970.6,
"actual_vs_expected": 1.02,
"timed_runs": 96291,
"early_pace_pct": 19.8,
"debut_runs": 2182,
"debut_wins": 488,
"debut_win_pct": 22.36
},
"by_region": [
{
"region": "GB",
"runs": 118834,
"wins": 23125,
"win_pct": 19.46,
"places": 65990,
"place_pct": 55.53,
"priced_runs": 118690,
"priced_wins": 23097,
"expected_wins": 22644.1,
"actual_vs_expected": 1.02,
"timed_runs": 94640,
"early_pace_pct": 19.9,
"debut_runs": 2141,
"debut_wins": 481,
"debut_win_pct": 22.47
},
{
"region": "IE",
"runs": 1979,
"wins": 334,
"win_pct": 16.88,
"places": 1061,
"place_pct": 53.61,
"priced_runs": 1967,
"priced_wins": 333,
"expected_wins": 336.4,
"actual_vs_expected": 0.99,
"timed_runs": 1651,
"early_pace_pct": 16.1,
"debut_runs": 41,
"debut_wins": 7,
"debut_win_pct": 17.07
}
],
"by_distance": [
{
"band": "standard",
"metres": "350 to 574",
"runs": 95043,
"wins": 18628,
"win_pct": 19.6,
"places": 53240,
"place_pct": 56.02,
"priced_runs": 94920,
"priced_wins": 18604,
"expected_wins": 18062.1,
"actual_vs_expected": 1.03,
"timed_runs": 76310,
"early_pace_pct": 20.2,
"debut_runs": 1731,
"debut_wins": 392,
"debut_win_pct": 22.65
},
{
"band": "staying",
"metres": "575 to 749",
"runs": 5909,
"wins": 1223,
"win_pct": 20.7,
"places": 3354,
"place_pct": 56.76,
"priced_runs": 5901,
"priced_wins": 1221,
"expected_wins": 1174,
"actual_vs_expected": 1.04,
"timed_runs": 4702,
"early_pace_pct": 17.9,
"debut_runs": 22,
"debut_wins": 5,
"debut_win_pct": 22.73
}
],
"by_trap": [
{
"traps": "1-2",
"runs": 44790,
"wins": 9003,
"win_pct": 20.1,
"places": 25401,
"place_pct": 56.71,
"priced_runs": 44731,
"priced_wins": 8991,
"expected_wins": 8902,
"actual_vs_expected": 1.01,
"timed_runs": 35690,
"early_pace_pct": 24.6,
"debut_runs": 812,
"debut_wins": 196,
"debut_win_pct": 24.14
}
],
"by_age": [
{
"age": "under-2",
"label": "under 2 years",
"runs": 16960,
"wins": 3901,
"win_pct": 23,
"places": 9955,
"place_pct": 58.7,
"priced_runs": 16934,
"priced_wins": 3896,
"expected_wins": 3607.4,
"actual_vs_expected": 1.08,
"timed_runs": 13480,
"early_pace_pct": 21.3,
"debut_runs": 2019,
"debut_wins": 461,
"debut_win_pct": 22.83
}
],
"by_track": [
{
"track": "Monmore",
"runs": 11276,
"wins": 2142,
"win_pct": 19,
"places": 6212,
"place_pct": 55.09,
"priced_runs": 11262,
"priced_wins": 2139,
"expected_wins": 2076.7,
"actual_vs_expected": 1.03,
"timed_runs": 8860,
"early_pace_pct": 19.5,
"debut_runs": 197,
"debut_wins": 44,
"debut_win_pct": 22.34
}
],
"top_offspring": [
{
"dog_id": 2893016637,
"name": "Yahoo Megan",
"runs": 92,
"wins": 44,
"win_pct": 47.83,
"places": 71,
"first_run": "2023-09-08",
"last_run": "2026-09-16"
},
{
"dog_id": 1655044329,
"name": "Swift Alien",
"runs": 131,
"wins": 40,
"win_pct": 30.53,
"places": 84,
"first_run": "2022-11-29",
"last_run": "2025-10-06"
}
]
}
}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.
Common uses
First-time runners
A dog on debut has no form of its own. Its sire's debut_win_pct, with the number of debuts behind it, is the only history there is, and the dam's sits beside it.
Pedigree features for a model
Each split is a feature a model can use directly: the staying record for a dog stepping up in trip, the trap 1-2 record for a railer drawn inside. Every rate carries its counts, so thin evidence can be weighted down rather than trusted.
Breeding and sales research
actual_vs_expected separates offspring that win often from offspring that win more often than the market expects, which is the question behind a stud fee or a sale price. active_offspring and last_run show whether the record is current.
Notes
Rebuilt weekly from the archive; meta.coverage.built_at says when. Each split adds up to the overall figures, except that a run with no trap or no birth date on record is left out of by_trap or by_age. A sire not in the figures answers 404 not_found, with a message naming what is covered.