Owner statistics
/v1/owners/{owner_id}/statsAvailable on Live Plus only
A Live key reaches the other 35 endpoints and
receives 403 upgrade_required here. Compare plans
Strike rate for one ownership by track, distance, trap and grade — and by trainer, the question only an owner can answer: which yards is this ownership actually winning with.
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 |
|---|---|---|---|---|
owner_id |
path | integer | yes | The owner identifier. Owner IDs come from Search owners. |
months |
query | integer | no | Rolling window in months. Default 12, maximum 60. |
track_id |
query | integer | no | Restrict every split to one track. |
Request
curl "https://api.greyhoundapi.com/v1/owners/2231/stats" \
-H "X-API-Key: $GAPI_KEY"<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/owners/2231/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/owners/2231/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/owners/2231/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/owners/2231/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"])Response
{
"meta": {
"request_id": "req_8f2ac1",
"data_as_of": "2026-07-08T13:05:12Z"
},
"data": {
"owner_id": 2231,
"name": "Justin Bowman",
"window_months": 12,
"track_id": null,
"overall": {
"runs": 97,
"wins": 9,
"places": 34,
"win_pct": 9.28,
"place_pct": 35.05,
"first_run": "2025-08-24",
"last_run": "2026-08-16"
},
"by_trainer": [
{
"trainer": "Justin Bowman",
"runs": 66,
"wins": 8,
"places": 28,
"win_pct": 12.12,
"place_pct": 42.42
},
{
"trainer": "Chloe Bowman",
"runs": 19,
"wins": 0,
"places": 3,
"win_pct": 0,
"place_pct": 15.79
}
],
"by_track": [
{
"track": "Sale",
"runs": 40,
"wins": 3,
"places": 16,
"win_pct": 7.5,
"place_pct": 40
}
],
"by_distance": [
{
"distance_m": 435,
"runs": 28,
"wins": 2,
"places": 10,
"win_pct": 7.14,
"place_pct": 35.71,
"best_time_s": 24.58,
"avg_time_s": 25.21
}
],
"by_going": [
{
"going": "standard",
"going_values": [
0
],
"runs": 51,
"wins": 5,
"places": 18,
"win_pct": 9.8,
"place_pct": 35.29
}
],
"by_trap": [
{
"trap": 6,
"runs": 9,
"wins": 3,
"places": 6,
"win_pct": 33.33,
"place_pct": 66.67
}
],
"by_grade": [
{
"grade": "G5",
"runs": 97,
"wins": 9,
"places": 34,
"win_pct": 9.28,
"place_pct": 35.05
}
]
}
}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.
What this is for
Ownership is the layer of greyhound racing with the least published data and some of the most interesting. A syndicate may have dogs spread across three or four yards, and the question that matters to them is not how the dogs are running but which trainer is getting results.
That is what by_trainer answers, and no other endpoint can. Alongside it the usual splits — track, distance, trap, grade and going — describe where an ownership actually competes, over the same rolling window as trainer statistics.
It is also the most useful endpoint for tracing a stable's reach. Ownership names recur across yards and tracks in ways that trainer records alone do not reveal.
Common uses
Which yard is earning its keep
by_trainer gives runs, wins and strike rate for every trainer an ownership uses. For a syndicate paying several sets of training fees, that is the whole picture in one call.
Ownership pages and directories
Combined with /v1/owners/search, enough to build a browsable owner section — the splits give each page real substance rather than a list of runners.
Connections analysis
Owner and trainer combinations carry signal that either alone does not. Cross-referencing this with trainer statistics surfaces partnerships that outperform both parties' averages.
AI and research agents
A grounded answer to "who owns the winners at this track" needs aggregation, not raw results. This returns it pre-computed and small enough to reason over.
Notes
by_trainer is unique to this endpoint. Same rolling window as trainer statistics.