Every recorded run for one greyhound, newest first. SOURCE. The official Topaz feed for Australian greyhound racing, synced into this system twice a day at 22:30 and 00:30 UTC. Coverage runs from 2020-01-01 to the last meeting the latest sync carried; `source.coverage_to` gives that date and `source.synced_at` the sync timestamp, so a client can see exactly how current the answer is. Greyhounds only — thoroughbred and harness form come from a different source and are not served here. RESOLVING `dog`. Pass a Topaz dogId for an exact answer, or a name. Names are compared on letters and digits only, so "Ando's Mac", "ANDOS MAC" and "andos mac" are one query. Partial names do not match; the whole name must. When one name belongs to several dogs (9 names in 69,040 dogs do), the response is a 200 carrying `ambiguous: true` and `candidates[]` with each dogId, its career starts and its last start date, and `runs` is empty. Re-query with the dogId you want. A name matching nothing returns 404. JOINING TO LIVE DATA. `dog_id` here is the same identifier as the numeric part of `runner_ref` on /v1/racing/results runners, which greyhounds carry as "grv:<dogId>" — strip the prefix and you have the join key from a settled result to this form history. `trainer.id` is the Topaz trainerId and is stable across meetings. `topaz_race_id` groups every runner in one race within this feed; it is Topaz's identifier and is a different namespace from `race_id` on /v1/racing/next-to-go, /events and /results, which is our own UUID and is stable for a race from upcoming through to results. READING A RUN. `position` is the finishing place and is NULL when the dog did not complete the course; `abnormal` then says why (Fell, TailedOff, PulledUp, Disqualified, StayedInBox). `scratched: true` runs are kept in this list so the record is complete, and they carry no time, place or margin. `win_time_s` is the winning time of that race, so `time_s - win_time_s` is the dog's deficit; it is present even when the dog itself has no recorded time. `margin` is Topaz's published margin in lengths and `margin_s` the same gap in seconds. `sp` is the official starting price, not a bookmaker's price — for per-book prices on an upcoming race use /v1/racing/next-to-go or /v1/racing/best-odds. GRADES. `grade` is the race's type code; `grade_in` and `grade_out` are the DOG's grade entering and leaving the run, so `grade_in != grade_out` marks the runs that changed the dog's grade (155,976 of 2.86M runs do). `second_split_time` is recorded only at tracks that time two sectional points — 21% of runs carry one; NULL elsewhere means the track did not time it, never that the dog missed it. Cached 10 minutes. The source only changes twice a day, so a repeat query inside that window returns the same data.
X-API-Key
3 credits
curl 'https://api.puntersedge.online/v1/racing/greyhounds/form?dog=YOUR_DOG' \
-H 'X-API-Key: YOUR_KEY'
| Name | In | Type | Required | Description |
|---|---|---|---|---|
dog |
query | string | yes | Dog name or Topaz dogId. Names match case- and punctuation-insensitively on the whole name. |
limit |
query | integer | no | Most recent runs to return. |
Status codes: 200, 401, 402, 422, 429, 500. Response bodies are JSON; the full schema is in /openapi.json.
200 application/json
— this call costs 3 credits.
Field names and types are as the API returns them; values are a real sample, trimmed to a few items.
{
"ambiguous": false,
"candidates": [],
"dog_id": 760119227,
"dog_name": "VELOCITY YIN",
"runs": [
{
"box": 3,
"date": "2026-08-30",
"distance_m": 395,
"dog_id": 760119227,
"dog_name": "VELOCITY YIN",
"first_split_position": 5,
"first_split_time": 5.98,
"grade": "5",
"grade_in": "5",
"grade_out": "5",
"margin": "5.00L",
"margin_s": 0.34,
"pir": "5544",
"position": 4,
"race_number": 4,
"rug": 3,
"scratched": false,
"sp": 8.4,
"time_s": 22.65,
"topaz_race_id": -2075830351,
"track": "Albion Park",
"trainer": {
"id": -41481,
"name": "HEATH McADAM"
},
"weight_kg": 29.5,
"win_time_s": 22.31
}
],
"source": {
"coverage_from": "2020-01-01",
"coverage_to": "2026-08-31",
"feed": "topaz",
"region": "AU",
"sport": "greyhound",
"synced_at": "2026-09-01T00:32:11+00:00"
}
}
GET /v1/racing/acceptances — Full-day AU thoroughbred acceptance card: every meeting, race and runnerGET /v1/racing/best-odds — Best racing price per runner across booksGET /v1/racing/changes — Races and prices that changed since a timestampGET /v1/racing/events — Upcoming race listGET /v1/racing/greyhounds/stats — Greyhound record by track, distance, box or gradePOST /v1/racing/horses/backfill — Queue a batch of horses for paced form collectionDELETE /v1/racing/horses/backfill/{job_id} — Cancel the horses a job has not collected yetGET /v1/racing/horses/backfill/{job_id} — Progress of a backfill jobThe free tier needs no credit card, and the sandbox endpoints need no key at all.
Get a free API key Quickstart