Horse Racing Data API
REST access to over a decade of horse racing data across the UK, Ireland, Australia and the US: Betfair starting prices, forward racecards with live prices, and per-horse career profiles.
All endpoints are read-only GET requests returning JSON, served from
https://horses.sportsedgepro.co.uk. A machine-readable
OpenAPI 3.0 spec is available for client generation.
Authentication
Every endpoint except the discovery document requires an API key, sent as a bearer token. The API has its own account system, separate from the SportsEdgePro dashboard login — create a developer account, subscribe to a plan, and manage keys from your developer account page.
# Recommended: Authorization header
curl -H "Authorization: Bearer sep_live_YOUR_KEY" \
"https://horses.sportsedgepro.co.uk/api/v1/prices?country=UK&limit=5"
# Fallback for clients that cannot set headers
curl "https://horses.sportsedgepro.co.uk/api/v1/prices?api_key=sep_live_YOUR_KEY"
Tiers & pricing
The API is sold on its own, independent of any SportsEdgePro dashboard subscription — sign up for a developer account and pick a plan at any time. The same developer login also works for the Greyhound Data API, with an independent plan and keys per product.
| Plan | Price | Rate | Daily quota | Max page | History | Racecards |
|---|---|---|---|---|---|---|
| Basic | £14.99/mo | 120/min | 25,000 | 500 rows | 1095 days | Yes |
| Pro | £39.99/mo | 600/min | 250,000 | 1000 rows | Full archive | Yes |
| Enterprise | Contact us | 3000/min | Unlimited | 5000 rows | Full archive | Yes |
Responses carry X-RateLimit-Limit, X-Quota-Limit and
X-Quota-Remaining. Quotas reset at 00:00 UTC. A 429
includes Retry-After.
Conventions
Response shape
Collections return a data array alongside a meta object.
{
"data": [ { /* ... */ } ],
"meta": {
"count": 100,
"limit": 100,
"offset": 0,
"has_more": true,
"date_from": "2026-08-01",
"date_to": "2026-08-07"
}
}
meta.has_more is
false rather than reading a total.
Dates & paging
- Dates are
YYYY-MM-DD; timestamps are ISO 8601. - Historical endpoints default to the last 7 days if no range is given.
- A single request may span at most 366 days. Walk longer periods with
date_from/date_to. - Page with
limitandoffset; sort withsortandorder. - List filters are comma-separated, e.g.
track=Ascot,Newmarket.
Errors
Errors return a consistent body with a stable machine-readable code.
{
"error": {
"code": "invalid_parameter",
"message": "'bsp_min' must be a number.",
"param": "bsp_min"
}
}
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter | A parameter failed validation. |
| 401 | missing_api_key | No key supplied. |
| 401 | invalid_api_key | Key not recognised. |
| 403 | wrong_product | Key is valid but not for this API (e.g. a greyhounds key). |
| 403 | key_revoked | Key was revoked. |
| 403 | key_expired | Key passed its expiry. |
| 403 | tier_forbidden | Your tier lacks this dataset. |
| 404 | not_found | No such record or endpoint. |
| 429 | rate_limit_exceeded | Too many requests this minute. |
| 429 | quota_exceeded | Daily quota spent. |
| 503 | maintenance | Temporarily unavailable. |
Prices
Betfair starting prices, one row per runner per race, with pre-play and in-play highs and lows, traded volumes, and form context (win streak, races in the last 30 days, last-time-out result, course/distance winner flags).
| Parameter | Description |
|---|---|
country | UK (default), IRE, AUS, USA. |
market_type | win (default) or place. |
date_from, date_to | Range, max 366 days. Defaults to last 7 days. |
track | Comma-separated track names. |
horse | Exact horse name. |
jockey, trainer | Name, case-insensitive. Populated for UK/IRE from 2020-08, AUS/USA from 2026-04. |
bsp_min, bsp_max | Betfair SP bounds. |
bsp_rank | Favouritism rank; 1 is the favourite. |
runners | Exact field size. |
draw | Stall/draw number. |
distance_min, distance_max | Race distance in furlongs. |
race_type | Comma-separated race types (e.g. Hcap, Mdn). |
result | win or lose. |
exclude_nsp | 1 (default) drops the BSP=1000 sentinel. |
sort, order | event_dt, bsp, bsp_rank, horse_name, track, runners, distance_f; asc/desc. |
# Beaten favourites at Ascot in a date range
curl -H "Authorization: Bearer $KEY" \
"…/api/v1/prices?track=Ascot&bsp_rank=1&result=lose\
&date_from=2026-07-01&date_to=2026-07-31"
Every runner in a single Betfair market, ordered by favouritism.
Horse profiles
Career summary (runs, wins, win percentage, average BSP, back/lay ROI, active
dates) and recent form lines. Set runs (1–200, default 20) to
control form depth, and optionally country to restrict to one.
Racecards
Races scheduled for a date. Pass date (default today),
country (default UK), and
include_runners=true to embed declared runners with live prices.
A single racecard with its declared runners. market_id is the Betfair
market id from /racecards; pass the same date/country
if the race is not today/UK.
Reference
Tracks in the archive with race counts and first/last race dates.
Valid enumerations, sortable fields and archive coverage — useful for validating input client-side.
Usage
Your tier limits, today's consumption and 30 days of history. Does not count against your quota meaningfully — poll it sparingly.
{
"data": {
"tier": "pro",
"limits": { "requests_per_minute": 600, "requests_per_day": 250000 },
"today": { "requests": 1420, "remaining": 248580 }
}
}