Documentation / Reference & coverage
Report coverage
/v1/meta/reports
How many race reports exist, from when, and for which jurisdictions.
Available on
Send your key in the X-API-Key header, or as
?key= if your tool cannot set one. A date outside your plan's window returns
403 outside_window naming the window, never an empty array.
Parameters
None. This endpoint takes nothing beyond your key.
Request
curl https://api.apihorseracing.com/v1/meta/reports \ -H "X-API-Key: $AHR_KEY"
$ch = curl_init('https://api.apihorseracing.com/v1/meta/reports'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('AHR_KEY')], ]); $data = json_decode(curl_exec($ch), true)['data'];
const res = await fetch( 'https://api.apihorseracing.com/v1/meta/reports', { headers: { 'X-API-Key': process.env.AHR_KEY } } ); const { meta, data } = await res.json();
import os, requests r = requests.get( "https://api.apihorseracing.com/v1/meta/reports", headers={"X-API-Key": os.environ["AHR_KEY"]}, ).json()
curl https://api.apihorseracing.com/v1/meta/reports?key=$AHR_KEY
$url = 'https://api.apihorseracing.com/v1/meta/reports' . '?key=$AHR_KEY'; $data = json_decode(file_get_contents($url), true)['data'];
const res = await fetch( 'https://api.apihorseracing.com/v1/meta/reports?key=$AHR_KEY' ); const { meta, data } = await res.json();
import os, requests r = requests.get( "https://api.apihorseracing.com/v1/meta/reports?key=$AHR_KEY", ).json()
Response
{ "meta": { "request_id": "16b336a77e36bc74", "data_as_of": "2026-09-12T05:10:27+00:00", "plan": "analyst", "window": "2017 → upcoming" }, "data": { "available": true, "races": 577, "from": "2020-01-01", "to": "2020-01-21", "regions": { "GB": 470, "IRE": 107 }, "by_year": { "2020": 577 }, "note": "Reports are written for Britain and Ireland from 2020 onwards. Coverage is partial and grows; a race with no report returns null rather than an error." } }
A real response from /v1/meta/reports,
captured by calling the live API rather than written by hand.
Response fields
Each field is described once and rendered on every endpoint that returns it, so the wording cannot drift between pages.
| Field | Type | What it is |
|---|
Errors this endpoint returns
| Code | Status | When |
|---|---|---|
| unauthorized | 401 | No key, or one we do not recognise. Check the header name and that the key has not been rotated from your account page. |
| rate_limited | 429 | Past your per-minute rate. Retry-After is set, and X-RateLimit-Remaining tells you where you stand on every successful response too. |
| server_error | 500 | Ours, not yours. Every response carries a request_id; quote it and we can find the exact request. |
Run it live
A real request from your browser straight to
api.apihorseracing.com with
your own key. Nothing is proxied and nothing is logged by this page.
Remembered in this browser so you do not paste it on every page. Forget it
What this is for
How many race reports exist, the dates they span, and the split by jurisdiction and by year.
Reachable on every plan including a free key, on purpose. Whether the reports are worth paying for depends on how many there are and which years they cover, and that is not a question you should have to pay to answer.
Coverage is partial and always will be. Reports are written for Britain and Ireland from 2020, because the market movement that gives them most of their substance is not published elsewhere. A race with no report returns null rather than an error.