horseracingapi.co.uk

Search races

Live, Archive and CompleteMCP: search_races

UK races by date, course, type, going, class and field size. British and Northern Irish racing only.

GEThttps://api.horseracingapi.co.uk/v1/races/search
Try itruns against the real API with your key
Get a free key
GET /v1/races/search
Examplea real answer from 2026-10-29, trimmed to a few rows
{
    "data": [
        {
            "race_id": "rc_676s9p1h",
            "meeting_id": "mt_4wycegh0",
            "course": "Stratford",
            "time": "13:50",
            "off_time": "13:51:40",
            "name": "EBF And Charlie Longsdon Racing 'National Hunt' Novices' Hurdle (GBB Race) (Div 1)",
            "run_type": "Hurdle",
            "class": "4",
            "distance": "2m 70y",
            "going": "Good to Soft (Soft in places)",
            "surface": "TURF",
            "handicap": false,
            "runners": 10,
            "result_available": true,
            "date": "2026-10-29"
        },
        {
            "race_id": "rc_rcq05g1h",
            "meeting_id": "mt_4wycegh0",
            "course": "Stratford",
            "time": "14:20",
            "off_time": "14:20:54",
            "name": "EBF And Charlie Longsdon Racing 'National Hunt' Novices' Hurdle (GBB Race) (Div 2)",
            "run_type": "Hurdle",
            "class": "4",
            "distance": "2m 70y",
            "going": "Good to Soft (Soft in places)",
            "surface": "TURF",
            "handicap": false,
            "runners": 10,
            "result_available": true,
            "date": "2026-10-29"
        }
    ],
    "meta": {
        "request_id": "298eb4c0af1cf035",
        "plan": "complete",
        "window": "January 2017 to the next 3 days",
        "data_as_of": "2026-10-30T12:46:35+00:00",
        "count": 5
    }
}
  

Parameters

NameInTypeRequiredWhat it does
date_fromquerydatenoFrom this UK day, YYYY-MM-DD. Held to your plan's window; meta.searched says what was used.
date_toquerydatenoTo this UK day, YYYY-MM-DD. Held to your plan's window.
course_idqueryidnoOur id for the course, as other answers give it (cr_ and eight characters).
run_typequerystringnoThe kind of race.
FlatHurdleChaseNH Flat
classquerystringnoThe race class as published, for example Class 4.
goingquerystringnoThe going as published, matched exactly, for example Good to Soft.
surfacequerystringnoTurf, or the all-weather surface by name, for example Polytrack or Tapeta.
handicapquerybooleannotrue for handicaps only, false for everything else.
truefalse
min_runnersqueryintegernoRaces with at least this many runners.
max_runnersqueryintegernoRaces with at most this many runners.
result_availablequerybooleannotrue for settled races only.
truefalse
limitqueryintegernoHow many rows in one answer, 1 to 200. Default 50.
cursorquerystringnonext_cursor from the previous answer, to read the next rows. Never build one.

Returns

A list in data, one row each, with meta.count. Every answer carries meta: request_id, plan, window and data_as_of.

FieldTypeHolds
race_idstringOur id for the race.
meeting_idstringOur id for the meeting.
coursestringThe course name.
timestringThe advertised off time by the racecourse clock, HH:MM.
off_timestringWhen the race actually went off, by the racecourse clock; null until it has.
namestringThe name, as raced: the race title on a race.
run_typestringFlat, Hurdle, Chase or NH Flat.
classstringThe race class.
distancestringThe race distance as published, for example 2m 87y.
goingstringThe going as declared; null until it is.
surfacestringTurf or the all-weather surface.
handicapbooleanWhether the race is a handicap.
runnersintegerThe runners, or how many there were.
result_availablebooleanWhether the race is settled.
datestringThe UK racing day, YYYY-MM-DD.

Errors

CodeStatusWhen
unauthorized401No key was sent, or the key is not one of ours.
upgrade_required403Your plan does not reach this endpoint. The answer names the plans that do.
outside_plan_window403The day asked for is outside what your plan reads. The answer gives your window and the day you asked for.
bad_request400A value is the wrong shape: a date that is not YYYY-MM-DD, a cursor that is not ours, or a key sent in the address.
unknown_parameter422A parameter this endpoint does not take. The answer lists the ones it does.
not_found404No record has that id, or it is not British or Northern Irish racing.
rate_limited429Too many calls this minute for your plan.
quota_exceeded429Your plan's calls for the month are used. The answer says when they reset.