SPORTSEDGEPRO
Horse Racing

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.

10.5M
Price records
2012
Archive start
4
Countries

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"
Keys are shown once. We store only a SHA-256 hash, so a lost key cannot be recovered — revoke it and create a new one.

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.

PlanPriceRateDaily quota Max pageHistoryRacecards
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
EnterpriseContact 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"
  }
}
No total count. Counting a filtered slice of 10M+ rows costs more than returning the page, so page until meta.has_more is false rather than reading a total.

Dates & paging

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"
  }
}
StatusCodeMeaning
400invalid_parameterA parameter failed validation.
401missing_api_keyNo key supplied.
401invalid_api_keyKey not recognised.
403wrong_productKey is valid but not for this API (e.g. a greyhounds key).
403key_revokedKey was revoked.
403key_expiredKey passed its expiry.
403tier_forbiddenYour tier lacks this dataset.
404not_foundNo such record or endpoint.
429rate_limit_exceededToo many requests this minute.
429quota_exceededDaily quota spent.
503maintenanceTemporarily unavailable.

Prices

GET/api/v1/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).

ParameterDescription
countryUK (default), IRE, AUS, USA.
market_typewin (default) or place.
date_from, date_toRange, max 366 days. Defaults to last 7 days.
trackComma-separated track names.
horseExact horse name.
jockey, trainerName, case-insensitive. Populated for UK/IRE from 2020-08, AUS/USA from 2026-04.
bsp_min, bsp_maxBetfair SP bounds.
bsp_rankFavouritism rank; 1 is the favourite.
runnersExact field size.
drawStall/draw number.
distance_min, distance_maxRace distance in furlongs.
race_typeComma-separated race types (e.g. Hcap, Mdn).
resultwin or lose.
exclude_nsp1 (default) drops the BSP=1000 sentinel.
sort, orderevent_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"
GET/api/v1/prices/race/{event_id}

Every runner in a single Betfair market, ordered by favouritism.

Horse profiles

GET/api/v1/horses/{horse_name}

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

GET/api/v1/racecards Starter and above

Races scheduled for a date. Pass date (default today), country (default UK), and include_runners=true to embed declared runners with live prices.

GET/api/v1/racecards/{market_id} Starter and above

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

GET/api/v1/tracks

Tracks in the archive with race counts and first/last race dates.

GET/api/v1/reference

Valid enumerations, sortable fields and archive coverage — useful for validating input client-side.

Usage

GET/api/v1/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 }
  }
}