Documentation / Owners

Owner statistics

GET/v1/owners/{owner_id}/stats

Available 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

NameInTypeRequiredDescription
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

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

GET/v1/owners/{owner_id}/stats

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.