Dog pace profile
/v1/dogs/{dog_id}/paceAvailable on Live Plus only
A Live key reaches the other 42 endpoints and
receives 403 upgrade_required here. Compare plans
How a greyhound RUNS a race rather than how fast: its average rank at the first bend, its average finish, and the gap between them. Positive means it passes runners, negative means it comes back to the field. Rebuilt nightly from every timed run.
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 |
|---|---|---|---|---|
dog_id |
path | integer | no | The greyhound identifier. |
Request
curl "https://api.greyhoundapi.com/v1/dogs/2481509210/pace" \
-H "X-API-Key: $GAPI_KEY"<?php
$ch = curl_init('https://api.greyhoundapi.com/v1/dogs/2481509210/pace');
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/dogs/2481509210/pace', {
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/dogs/2481509210/pace', {
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/dogs/2481509210/pace",
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/dogs/2481509210/pace?key=$GAPI_KEY"<?php
$url = 'https://api.greyhoundapi.com/v1/dogs/2481509210/pace' . (str_contains('https://api.greyhoundapi.com/v1/dogs/2481509210/pace', '?') ? '&' : '?') . '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/dogs/2481509210/pace?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/dogs/2481509210/pace?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/dogs/2481509210/pace",
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
{
"dog": {
"dog_id": 2481509210,
"name": "A Bad Winter"
},
"pace": {
"runs": 47,
"runs_full_field": 47,
"profile": "consistent_pace",
"reliability": 0.93,
"avg_bend_rank": 2.87,
"avg_finish": 3,
"position_gain": -0.13,
"gain_consistency": 1.38,
"led_at_bend": 21.3,
"top_2_at_bend": 46.8,
"win_rate": 21.3
},
"by_trip": [
{
"track": {
"track_id": 3822562785,
"name": "Kinsley"
},
"distance_m": 462,
"runs": 28,
"runs_full_field": 28,
"profile": "mid_race_mover",
"reliability": 0.9,
"avg_bend_rank": 3.36,
"avg_finish": 2.96,
"position_gain": 0.39,
"gain_consistency": 1.37,
"led_at_bend": 7.1,
"top_2_at_bend": 35.7,
"win_rate": 21.4
}
],
"method": {
"measured_from": "sectional rank within each race, and finishing position",
"minimum_runs": {
"overall": 15,
"per_trip": 20
},
"position_gain": "bend rank minus finish. + passes runners, - fades."
}
}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.
Notes
Every figure is a RANK within the dog's own race, so nothing needs adjusting for going, track or distance — runners are compared against the six that stood beside them. Sectionals are the only per-runner quantity the source measures rather than estimates, so nothing here is built on a derived time. A profile needs 15 runs (20 per trip): about a quarter of the run-to-run variation is the dog and the rest is the night, and that is where a dog average becomes reliable enough to label. reliability is returned so you can weight it rather than trust it flat.