Documentation / Guides
Data freshness
What data_as_of means and when the archive moves.
Racing data has a freshness, and pretending otherwise is how a stale result gets shown as live. Every response tells you how fresh it is; this explains what the number means.
data_as_of
In meta on every single response. It is the moment the serving database was
last written, not the moment you asked.
"meta": {
"data_as_of": "2026-09-09T08:50:32+00:00",
"plan": "complete",
"window": "2017 → upcoming"
}
Two responses in the same second carry the same data_as_of. If it stops
advancing during a racing afternoon, something upstream has stopped, and that is worth alerting
on. The status page reads the same value.
How often it moves
The sync runs every ten minutes. In practice a result appears within minutes of settling in Britain and Ireland, and can take longer elsewhere, because the delay is mostly the jurisdiction publishing rather than us fetching.
Declarations for future days arrive when they are published, which is 48 hours out for most British racing and later elsewhere.
What never changes
A settled race is final. Once a result is in the archive it does not move. You can store it and never re-fetch it, and the only reason to re-read a past date is to pick up an upstream correction, which is rare.
What does change is what has not happened yet: declarations before the off, going on the morning, and non-runners.
The archive is still loading
The backfill runs from January 2017 forward and has not caught up to the present. This is the single most important thing to understand about freshness right now.
- Race counts and date spans grow daily.
- Today's card may be empty on any plan until the crawl reaches the present.
- Nothing already loaded changes as it catches up.
/v1/meta/coverage returns the newest date held. Check it before concluding a
date is missing; the difference between "not loaded yet" and "no racing that day" matters and
that endpoint is how you tell.
Caching, sensibly
| What | How long | Why |
|---|---|---|
| Courses, countries, reference values | Indefinitely | A few hundred rows that effectively never change |
| A settled race or result | Indefinitely | Final once published |
| A past date's card | Indefinitely | Same reason |
| Today's card | A few minutes | Non-runners and going change |
| Statistics | Hours | Computed over the archive; one day's racing barely moves them |
| Coverage totals | An hour | They only move when the sync runs |
Stop polling for results
A process checking every thirty seconds is about ninety thousand requests a month, and it still finds out later than a webhook would. Subscribe to result.received: deliveries arrive as soon as the race settles and cost nothing against your quota.
If you cannot take a webhook, poll /v1/results/latest with a small limit rather
than re-fetching whole dates.